Sca*_*ark 9 c++ templates template-specialization
鉴于此代码:
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
{
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到以下错误.
test.cpp:16: error: template-id 'func<char*>' for 'void X::func(const char*&)' does not match any template declaration
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解吗?
如果您更改声明:
template<> void X::func< char * >( const char * & v )
Run Code Online (Sandbox Code Playgroud)
至:
template<> void X::func< char * >( char * const & v )
Run Code Online (Sandbox Code Playgroud)
这将完美无缺.为什么会这样?因为虽然const sometype完全可以接受,但它只是一种替代符号sometype const.因此,您的const修饰符不应用于基本类型(char),而是应用于指针,使"常量指针指向非常量字符"成为有效类型.如果那不是你想要的,你将不得不纠正你的基本模板.
最后,这里有一些有趣的解读为什么重载模板通常比专门化它们更好.
您遇到此错误的原因是因为您const在类型之前写入。尽管这是常见的做法,但它不利于理解 const/易失性限定符 (cv-qualifier) 的工作原理。
在这种情况下,const Twhen Tischar*并不意味着const char*。它更确切地说char* const是因为Tischar*并且无论T你放在哪一边const,它的行为都就像const是在右侧T,也就是说,指针本身将是 const 而不是指向的类型。
如果您规定始终将“const或”volatile放在类型的右侧,则很容易避免这种类型的混乱。例如,T const当Tis char*to时,它使得精神上的扩展变得简单char* const。
这就是在 boost 源中您在类型之后而不是之前看到 cv 限定符的原因。