2011-12-02 156 views

回答

7

其中一种方法是不提供默认实现,并且只对您希望允许的类型专门化您的类模板。例如:

#include <iostream> 
using namespace std; 

template<class X> class Gizmo 
{ 
public: 
    Gizmo(); 
}; 

template<> Gizmo<int>::Gizmo() 
{ 
} 

int main() 
{ 
    Gizmo<float> gf; // ERROR: No specialization for Gizmo<float> results in a linking error 
} 
3

您可以点击这里Restrict Template Function

我不能离开评论所以它是一个答案......

+1

很好的答案,弄清楚一个例子: 'struct No {}; struct是:public No {};模板 struct myfunction_allower {enum {value = true}; }; template <> struct myfunction_allower {enum {value = false}; };模板 void myfunction(T){static_assert(myfunction_allower :: value,“type not allowed”); } void test(){myfunction(1。); struct否否; MyFunction的(否); //失败,错误C2338:type not allowed struct是是; MyFunction的(是); //它的工作原理:禁止不是传递性的}' – reder

3

使构造私人的违法类型:

template<typename T> 
class Z 
{ 
public: 
    Z() {} 
}; 

template<> 
class Z<int> 
{ 
private: 
    Z(); 
}; 

Z<float> f; // OK 
Z<int> i; // Compile time error. 
+0

我想知道是否离开专业化不完整不会更简单,仍然有诀窍? – UncleBens

+0

@UncleBens,这将产生一个链接器错误(我认为这就是你的意思:'template <> class Z {public:Z();};'。正如我上面它产生一个编译器错误,早期检测 – hmjd

+1

不,我的意思是'template <> class Z ;'你不应该在编译时实例化一个不完整的类型(基本上是相同的 - 但是是相反的 - 就像接受的答案一样,如果基本模板不完整) – UncleBens

相关问题