编译:
template <class T>
class Bar {};
template<class T, class Dummy=void>
class Foo;
template<class T>
class Foo <T, typename std::enable_if<
std::is_base_of<Bar<T>, T>::value
>::type> {
public:
//THIS CHANGES IN THE 2ND SNIPPET
void test () const {
std::cout << "test";
}
};
class Cat : Bar<Cat> {};
int main () {
Foo<Cat> foo;
foo.test();
return 0;
}
此错误:
template <class T>
class Bar {};
template<class T, class Dummy=void>
class Foo;
template<class T>
class Foo <T, typename std::enable_if<
std::is_base_of<Bar<T>, T>::value
>::type> {
public:
//THIS CHANGED!
void test () const;
};
//THIS WAS ADDED SINCE THE 1ST SNIPPET!
template<class T>
void Foo<T>::test () const {
std::cout << "test";
} //error C2039: 'test' : is not a member of 'Foo<T>'
class Cat : Bar<Cat> {};
int main () {
Foo<Cat> foo;
foo.test();
return 0;
}
我已经标出了差异。 为什么在第二个代码段中出错?如何在避免错误的同时保持声明和定义分开?
我猜它与此有关: “模板 void Foo :: test()const“
就像,这是告诉编译器方法 test()const 是模板类模板类Foo,T&gt; :: value&gt; ::的方法的错误方法类型&GT;
我当然是在谷歌和StackOverflow上查了一下,但似乎每当模板弹出这个错误时,每次都有不同的原因。 (可能是因为很多事情都会导致C2039错误。)
另外,可以一个mod。或者有人帮我在这篇文章中添加 C2039 标签?它说我需要一分钟。 1500代表添加该标签。
- 漫步 - 还要注意的是,自从我使用C ++以来已经有一段时间了;因为我使用过模板,所以甚至更长。我知道这可能是一种使用模板的奇怪方式,但我可以向你保证我有正当的理由!
答案 0 :(得分:1)
14.5.4.3/1(C ++ 03)中给出了部分专用类模板的类外成员声明的示例。这就是它的样子
// primary template
template<class T, int I> struct A {
void f();
};
// class template partial specialization
template<class T> struct A<T,2> {
void g();
};
// member of class template partial specialization
template<class T> void A<T,2>::g() { }
如您所见,您必须在类外成员定义中指定专门的参数。
在你的情况下它应该是
template<class T>
void Foo<T, typename std::enable_if<
std::is_base_of<Bar<T>, T>::value>::type>::test () const {
std::cout << "test";
}