2012-12-12 52 views
1

可能重複:
using a template class without a template argument啓動模板類沒有模板變量

如果我有一個模板功能,我不需要進行實例化,因爲它可以從推斷參數,如下所示:

template<typename T> void MyFunc(T arg); 

int x;  
MyFunc(x); 

這是否適用於編譯器可以猜測模板參數?具體來說,我在想這個:

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

int x; 
MyClass<int> c1(x); // regular style 
MyClass c2(x); // is this allowed? 

回答

4

是的,沒有。

編譯器不推導出類型類模板參數,但允許默認值,所以如果你使用int頗有幾分此模板,你可以這樣做:

template <typename T=int> 
class MyClass { 
public: 
    MyClass(T) {} 
}; 

int x; 
MyClass<> c2(x); 

請注意,這只是儘管每個模板都有一個特定的類型。它不是根據您提供的參數類型來選擇類型,只是使用您爲模板指定的默認類型,如果您未指定類型,但已通過(例如)double,則上面的模板仍將實例化爲int ,而不是double

由於編譯器可以/將推斷模板參數函數模板,你也可以創建一個小的模板功能,並使用auto

template <class T> 
MyClass<T> make_MyClass(T const &v) { 
    return MyClass<T>(v); 
} 

int x; 

auto c2 = make_MyClass(x); 
2

不,這是不允許的;模板參數的扣減僅適用於模板函數,模板類不會從給定構造函數的參數中扣除模板參數。

3

不,這是不允許的,因爲編譯器只能在模板函數調用期間推導出類型。

也就是說,常見的解決方案是幫助函數。

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

template<typename T> 
MyClass<T> makeMyClass(T x) 
{ 
    return MyClass<T>(x); 
} 
+0

@JerryCoffin:你說得對,我做到了。 –