2014-02-25 458 views
3

此問題可能與此問題重疊:C++ explicit template specialization of templated constructor of templated class。 但是,我沒有找到該線程中的解決方案。模板化類的模板化構造函數的顯式模板特化

我有一個模板化的構造函數模板類:

template<typename First, typename ... Rest> class var { 
    public: 
     template<typename T> var(T& t) { 
      std::cout << "general" << std::endl; 
     } 
}; 

但如果這個類實例化與同一類參數(即一個對象,我們想調用禁止複製(或move-)構造函數)應該完成一些具體的事情。所以,我試過如下:

template<typename First, typename ... Rest> template<> 
var<First, Rest...>::var(var<First, Rest...>& v) { 
    std::cout << "copy" << std::endl; 
} 

當試圖使用g ++ 4.6編譯此我得到 錯誤:之前無效明確的專業化「>」令牌 錯誤:包含的類模板並未明確專門 從先前的錯誤,拯救

我看這個問題,我會明確地說爲哪一類,我想專門構造...

不過,我希望它變得清晰了我想做的事情。任何想法如何?

回答

1

模板的構造是沒有拷貝構造函數:

template<typename First, typename ... Rest> class var { 
    public: 
    var() {}; 
    var(const var& v) { 
     std::cout << "copy" << std::endl; 
    } 
    template<typename T> 
    var(const T& t) { 
     std::cout << "general" << std::endl; 
    } 
}; 

int main() 
{ 
    var<int> i0; 
    var<int> i1(i0); 
    var<int> i2("Hello"); 
} 

給人

copy 
general 

注:增加了一些常量

你試圖專注非拷貝構造函數拷貝構造函數失敗。

12.8:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).

+0

對於問題中提到的問題,您的回答正常。事實證明,我不完全問我想問什麼,所以有一個新的問題:http://stackoverflow.com/questions/22024090/class-with-templated-constructor-as-well-as-copy-and -move構造函數 – mg84

0

你不能沒有完全專業類的專業模板方法。它被C++標準禁止。

典型的解決方法是DieterLücking在回答中顯示的函數/方法超載。

Also answered here

相關問題