2013-10-24 33 views
1

我有一個模板類,它有一個拷貝構造函數:顯式模板特用於構造

template <> 
template <> 
ExampleClass<double,index_method>::ExampleClass<index_method>(const ExampleClass<double,index_method>& src_, const index_method& b_) 
    : _b(b_) 
{ 
} 

但它具有:

struct index_method {/*whatever*/}; 

template <class A, class B> 
class ExampleClass 
{ 
public: 
    ExampleClass(void) {} 
    template <class C> 
    ExampleClass(const ExampleClass<A,C>& src_, const B& b_ = B()) : _b(b_) { } 
private: 
    B _b; 
}; 

下面的模板構造專業化是由GCC 4.7.0編譯正確問題在MSVC:

error C2976: 'ExampleClass' : too few template arguments

基於另一個topic,我試過一個更簡單的代碼只適用於MSVC:

ExampleClass<double,index_method>::ExampleClass<index_method>(const ExampleClass<double,index_method>& src_, const index_method& method_) 
    : _b(method_) 
{ 
} 

但它也行不通。

有沒有什麼辦法可以在MSVC 2012中爲模板類指定一個模板拷貝構造函數?

+0

opalenzuela:我拒絕你的編輯對不起,是我的錯。我提出了修改建議。非常感謝! – Naszta

+0

clang 3.2也無法編譯下面的代碼,但有另一個錯誤。 錯誤:'ExampleClass'的外聯構造函數不能有模板參數 – ForEveR

+1

下面的代碼如何http://ideone.com/7vgtxt? – ForEveR

回答

3

我不知道爲什麼如此,因爲gcc編譯它,但鐺拒絕作爲MSVC,但與另一個錯誤。 但是,您可以簡單地使用下面的代碼

struct index_method {/*whatever*/}; 

template <class A, class B> 
class ExampleClass 
{ 
public: 
ExampleClass(void) {} 
template <class C> 
ExampleClass(const ExampleClass<A,C>& src_, const B& b_ = B()) : _b(b_) { } 
private: 
B _b; 
}; 

template <> 
template <> 
ExampleClass<double,index_method>::ExampleClass 
(const ExampleClass<double,index_method>& src_, const index_method& b_) 
: _b(b_) 
{ 
} 

Example

+0

僅適用於所有類型都有複製構造函數的定義。如果你想爲某種類型添加拷貝構造函數特化,你有什麼想法嗎? (使用gcc它工作得很好,但clang拒絕了錯誤 - 「限定引用」是一個構造函數名稱,而不是可以聲明構造函數的類型「 – foxfireee