是否可以防止在没有专业化的情况下使用C ++模板?
例如,我有
template<class T>
void foo() {}
我不希望在没有专门针对foo<int>
或foo<char>
的情况下使用它。
答案 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')。