3

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

例如,我有

template<class T>
void foo() {}

而且我不希望在没有专门用于foo<int>or的情况下使用它foo<char>

4

3 回答 3

8

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

template<class T>
void foo();

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

这对我来说很好用clang++

于 2012-09-11T02:53:59.260 回答
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!!!
}  
于 2012-09-11T07:16:57.817 回答
-1

当 foo 函数有参数时,这是可能的。例如:template void foo(T param){} 现在,你可以调用 foo(1), foo('c') 而无需专门化。

于 2012-09-11T02:46:53.233 回答