我的代码可以归结为:
//Just a templated array class .. implementation doesn't matter
template<int N>
struct Array {};
//A simple Traits like class
template<typename T>
struct MyTraits {}
//Specialization of the traits class
template<int N>
struct Foo< Array<N> >
{
static void monkey() {};
}
int main()
{
Foo< Array<3> >::monkey();
}
不幸的是编译器不喜欢它......
test.cpp: In function ‘int main()’:
test.cpp|17| error: ‘monkey’ is not a member of ‘Foo<Array<3> >’
我做错了什么,我该如何解决? 感谢
答案 0 :(得分:7)
以下适用于我:
//Just a templated array class .. implementation doesn't matter
template<int N>
struct Array {};
//A simple Traits like class
template<typename T>
struct MyTraits {};
//Specialization of the traits class
template<int N>
struct MyTraits< Array<N> >
{
static void monkey() {};
};
int main()
{
MyTraits< Array<3> >::monkey();
}
Foo
的方式不正确,因为您可以看到我更改了它以匹配评论。此外,在声明Foo
/ MyTraits
后,您丢失了分号。最后,对于数组类,我建议您使用size_t
作为N
的类型。
答案 1 :(得分:1)
如果您对此问题感兴趣,那就是:
template<unsigned int N>
class V {};
template<typename T>
struct MyTraits
{
};
template< int N>
struct MyTraits< V<N> >
{
static void monkey();
};
int main()
{
MyTraits< V<4> >::monkey( );
}
生成此错误
error: ‘monkey’ is not a member of ‘MyTraits<V<4u> >’
这是由于模板类型在一个点中是unsigned int而在另一个点中是int的不匹配引起的。 (有点难看)
将特质专业化改为
template< unsigned int N>
struct MyTraits< V<N> >
{
static void monkey();
};
让一切顺利。 (由于V的定义在第三方代码中,因此该问题模糊不清。)