다음과 같은 템플릿 클래스가 제공됩니다.
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
그 다음 공식 표준이 아니다는 비공식적으로 너무 것 같아요 그렇다면,.