2010-01-06 113 views
1

我有归结为以下代码: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> >’ 

我在做什么错了,怎么办我修复它? 感谢

+1

我错过了什么,或者你不使用你的特质课程? 'Foo'应该是'MyTraits'吗? – GManNickG 2010-01-06 07:28:53

回答

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的类型。

+0

你在这些问题上发现。他们大多是由复制,粘贴和修复​​问题引起的。看起来像我的问题在别的地方:( – 2010-01-06 07:58:58

+0

随意发布更多的代码,最好是真正的代码:)我们想让你的问题得到解决。 – GManNickG 2010-01-06 08:13:55

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

这引起模板类型之间的不匹配是在一个地方和一个int一个unsigned int在另一个。 (丑类)

改变性状的专业化是

template< unsigned int N> 
struct MyTraits< V<N> > 
{ 
    static void monkey(); 
}; 

使一切工作。 (由于V的定义在第三方代码中,所以此问题变得模糊)。