2011-07-26 126 views
1

我正在研究C++類模板的問題。一個類模板是專門化的,但編譯器並不總是選擇使用專業化。我發現,構造函數的參數似乎會影響此:依賴於構造函數參數的模板類特化?

temlate <class T> 
class MyClass { /*some constructors*/ }; 

template<> 
class MyClass <int> 
{ void foo(); /*some constructors*/} 

MyClass<int> test1; 
test1.foo(); //works 

MyClass<int> test1("hallo"); 
test1.foo(); //doesn't work (foo does not exist, compiler uses unspecialized version.) 

我還沒有成功地創建一個示例,演示了問題,因爲構造函數的參數是相當複雜的(並且不與簡單參數出現問題)。

但我的問題是這樣的:是否有可能,構造函數參數影響編譯器的選擇?怎麼樣?

我正在使用Visual C++ 2008.

非常感謝!

----編輯:

好像我們已經確定了問題:如果模板特並沒有在我們所建立的靜態庫中的所有翻譯單元的一部分,出現問題。但是,如果沒有其他翻譯單位,它就會消失。

我發現http://codeidol.com/cpp/cpp-templates/Instantiation/Implementation-Schemes/在我看來,在貪婪實現中,我們觀察到的現象可以解釋。

有誰知道MSVC和GCC實際使用哪種實現方案?

+1

請顯示完整的測試用例。 –

+0

「不起作用」是什麼意思? –

+2

@Philipp: 構造函數參數不太可能影響 專業化的選擇。你能發佈錯誤信息嗎? 我現在可以想到的原因是,變量定義被解析爲 函數聲明,該函數聲明由於最令人興奮的 解析而返回'MyClass '。 –

回答

2

但我的問題是這樣的:是否有可能,構造函數 參數影響編譯器的選擇?怎麼樣?

沒有,因爲你告訴它要使用哪種類型:

MyClass<int> test1; 
test1.foo(); //works 

總是創建專門類型的對象。

1

全局模板函數將是一個類型,編譯器將使用函數參數進行類型推導。同樣,類模板的「類型」參數將用作類的模板參數。

但是你想有一個構造函數(這是一些部分),將參加在模板類型推演 - 這是不可能的。

相關問題