C ++模板专业化问题

时间:2010-01-06 07:24:39

标签: c++

我的代码可以归结为:

//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> >’

我做错了什么,我该如何解决? 感谢

2 个答案:

答案 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的定义在第三方代码中,因此该问题模糊不清。)