2011-06-22 30 views
0

我有一個模板類,其構造函數採用std::vector<T>。對於除了一個對象之外的每個對象,我都希望它能夠進行操作A.但是對於那一個對象,我希望它可以做一些其他的東西B.具有不同主體的方法的模板顯式實例化

是否有可能僅爲模板類創建一個顯式實例化構造函數?我希望它的描述足夠精確。

問候

更新:我現在已經實現了一個測試用例:

//header 

Container(const std::vector<T>& source) 
{...} 

//source code 

template <> Container<int>::Container(const std::vector<int>& source) 
{ 
    throw 42; 
} 

這個例子編譯,但不起作用。我將它導出爲一個dll,並且希望在我嘗試使用泛型參數int創建類的實例時調用它。但是現在它只是調用每個其他對象所使用的標準構造函數。我必須對宣言做出改變嗎?

更新:我成功了!只需將其複製到頭文件。

更新:好的,現在我有另一個問題。我能夠針對「簡單」類型進行專門化,但不能用於模板。我試着這樣說:

template<typename T> 
Container<MyClass<T>>::Container(const std::vecror<MyClass<T>>& source) 
{...} 

我想專門爲它每MyClass的對象,但MyClass的本身應能住上作爲模板。

+3

這是不夠的。你能至少發佈僞代碼,你想做什麼? –

+0

*創建一個明確的實例*?你可能的意思是創建一個明確的**專業化**。你不創建實例化,你可以觸發實例化,既可以是隱式的,也可以是顯式的,但它們不是*創建*。 –

回答

5

你的問題不清楚。也許你的意思是像下面這樣的東西?

template <typename T> 
class Foo 
{ 
public: 
    Foo() { std::cout << "standard" << std::endl; } 
}; 

template <> 
Foo<float>::Foo() { std::cout << "random" << std::endl; } // Special case 

... 

Foo<int> f1; // Prints "standard" 
Foo<float> f2; // Prints "random" 
+0

這就是我的意思。謝謝! PS:我正在使用visual studio 2005. –

0

哪個編譯器? 我在使用某些舊版本的g ++編譯器以及Solaris和HPUX C++編譯器時遇到了模板實例問題。 template <>用於指定顯式實例。 很長一段時間我沒有專門的一門課只有一種方法。

你試過了嗎?

template <> TemplateClass<InstanciedType>::TemplateClass() { 
    ... 
} 

其中TemplateClass是要覆蓋的模板類實例。

+0

'template <>'做專業化,你可能指的是'模板'的顯式實例目的 – Nick

0

如果我明白你的問題正確,要做到這一點:

template< typename T > 
struct A 
{ 
    template< typename P > 
    A(std::vector<P> &v) 
    { 
    } 
};