是否可以防止在没有专业化的情况下使用C ++模板?

时间:2012-09-11 02:42:11

标签: c++ templates template-specialization

是否可以防止在没有专业化的情况下使用C ++模板?

例如,我有

template<class T>
void foo() {}

我不希望在没有专门针对foo<int>foo<char>的情况下使用它。

3 个答案:

答案 0 :(得分:8)

您应该能够在通用情况下声明该函数而不实际定义它。这将导致对非特定模板的引用以发出未定义的符号链接器错误。

template<class T>
void foo();

template<>
void foo<int>() {
    // do something here
}

clang++对我来说效果很好。

答案 1 :(得分:1)

您可以在函数体中使用未定义的类型。您将收到编译时错误消息:

template<class T> struct A;  
template<class T>  
void foo()  
{  
   typename A<T>::type a;  // template being used without specialization!!!
   cout << "foo()\n";  
}  
template<>  
void foo<int>()  
{  
   cout << "foo<int>\n";  
}  
template<>  
void foo<char>()  
{  
   cout << "foo<char>\n";  
}  
int main()  
{  
  foo<int>();  
  foo<char>();  
//  foo<double>();   //uncomment and see compilation error!!!
}  

答案 2 :(得分:-1)

当foo函数有参数时可能。 例如:template void foo(T param){} 现在,你可以在不专门的情况下调用foo(1),foo('c')。