给出这个代码:
class X { public: template< typename T > void func( const T & v ); }; template<> void X::func< int >( const int & v ) { } template<> void X::func< char * >( const char * & v ) // 16 { }
当我编译它,我得到以下错误.
test.cpp:16: error: template-id 'func<char*>' for 'void X::func(const char*&)' does not match any template declaration
任何人都可以看清这个吗?
解决方法
你面对这个错误的原因是因为你在类型之前编写const.虽然这是常见的做法,但不利于理解const / volatile限定词(cv-qualifier)的工作原理.
在这种情况下,当T为char *时,const T不表示const char *.这意味着char * const,因为T是char *,无论T的任何一面都放在const上,它的行为就像在T右边的const一样,也就是指针本身就不会是const .
如果您将规则总是将const或volatile放在类型的右侧,那么很容易避免这种混淆.例如,当T是char *到char * const时,它可以直观的展开T const.
这是增加资源的原因,您看到类型之后的cv-qualifiers,而不是之前.