C ++ 템플릿 클래스를 전달하는 방법은 무엇입니까? Type valueFor(const IDType& id)

다음과 같은 템플릿 클래스가 제공됩니다.

template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id) { // return value }
    ...
};

누군가가 헤더 파일에서이 클래스를 어떻게 앞으로 선언 할 수 있습니까?



답변

이것은 당신이 그것을하는 방법입니다.

template<typename Type, typename IDType=typename Type::IDType>
class Mappings;

template<typename Type, typename IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id) { // return value }
    ...
};

기본값은 실제 정의가 아닌 정방향 선언에 있습니다.


답변

템플릿의 첫 번째 선언에 대해서만 템플릿에 대한 기본 인수를 선언 할 수 있습니다. 사용자가 클래스 템플릿을 전달하도록 허용하려면 전달 헤더를 제공해야합니다. 기본값을 사용하여 다른 사람의 클래스 템플릿을 전달하고 싶다면 운이 좋지 않습니다!


답변

당신은 할 수 있습니다 누구의 정의 기본 인수를 내용의 템플릿 클래스를 선언하지만, 정의가 도입 될 때까지 클래스를 참조하는 모든 시간을 당신은 모든 인수를 포함해야합니다.

예. std::vector포함하지 않고 사용합시다 (의 두 번째 인수 std::vector는 기본값으로 정의 됨).

namespace std
{
    template<typename, typename>
    class vector;
}

#include <iostream>

template <typename S, typename T>
void Foo (const std::vector<S,T> & vector)
{
    std::cout << "do vector stuff, eg., display size = "
        << vector.size() << std::endl;
}

template <typename T>
void Foo (const T & t)
{
    std::cout << "do non-vector stuff..." << std::endl;
}

그런 다음 벡터를 포함하지 않고 사용할 수 있습니다. 예 :

int main()
{
    Foo(3);
}

그리고 우리는 그것을 사용할 수 있습니다 std::vector , 예를 들면 :

#include <vector>

// Now the compiler understands how to handle
// std::vector with one argument
// (making use of its default argument)

int main()
{
    Foo(std::vector<int>(3));
}

나는 표준 만에이 작품을 선택하지 않은 clang/ gcc-std=c++98최대를 -std=c++17그 다음 공식 표준이 아니다는 비공식적으로 너무 것 같아요 그렇다면,.