2010-09-13 175 views
1

我有這樣一類參數轉發:對於沒有參數的情況下

template <typename T1> A(T1 t1) : T(t1) {} 
template <typename T1, typename T2> A(T1 t1, T2 t2) : T(t1, t2) {} 
// ho, hum, copy, paste, yuck. 
// .... 

所有的好:

template<class T> class A : public T { 

// this is done to wrap the base class version of a virtual function 
virtual void F(int i) { 
    if(i < 0) T::F(-i); 
    else T::F(i); 
} 

//... 

需要被constructible任何一組參數的個數的基類可以與構建但對於默認構造函數:

template <> A() : T() {} 

不編譯

A() : T() {} 

如果T沒有默認構造函數,即使未調用A(),也會失敗。

} 

有沒有一種方法,使A()模板沒有任何ARGS?

回答

2

如果T沒有默認構造函數 即使未調用A()也會失敗。

class X 
{ 
public: 
    X(int) {} 
}; 

template <class T> 
class A: public T 
{ 
public: 
    A(): T() {} 
    template <class U> 
    A(const U& u): T(u) {} 
}; 

int main() 
{ 
    A<X> a(1); 
    //A<X> b; 
} 

這似乎編譯不同編譯罰款。是不是類模板的意圖是未使用的方法不會導致特定模板參數出錯,除非實際使用?

也許A的默認構造函數在某處被調用?


標準有這個例子來說明類模板和成員函數是如何實例化的。需要注意的是類的實例化和部件是分開的:

-3- [實施例:

template<class T> class Z { 
public: 
    void f(); 
    void g(); 
}; 

void h() 
{ 
    Z<int> a;    // instantiation of class Z<int> required 
    Z<char>* p;    // instantiation of class Z<char> not 
       // required 
    Z<double>* q;   // instantiation of class Z<double> 
       // not required 

    a.f();     // instantiation of Z<int>::f() required 
    p->g();     // instantiation of class Z<char> required, and 
       // instantiation of Z<char>::g() required 
} 

在這個例子中沒有需要類Z,Z ::克(),或Z ::˚F ()被隱式實例化。 ]

這意味着,就我所見,不僅模板方法在類模板中是「懶惰地」實例化的,而且常規成員也是如此。

+0

Bazaar,我可以得到你的結果,現在...然後導致下一個問題,你如何強制實例化方法,但這是一個不同的問題。 – BCS 2010-09-14 14:56:04

0

如果T沒有默認構造函數,那麼您實際上沒有任何選項。在這種情況下,A() : T() { }是一個明顯的錯誤。對你所處的情況給予更廣泛的認識,也許有一個更好的方式/更簡單的方式來完成這一切。

+0

是的,這將是一個錯誤。但是,如果我能夠如何強制該構造函數成爲模板,那就不是了。這將工作,因爲模板是懶惰的;除非你調用它們,否則它們不會執行語義檢查,所以即使'T()'會失敗,只要我不調用'A ()',它就不是錯誤。 – BCS 2010-09-13 23:43:26

+0

是啊我明白你的意思了;那麼'template A():T(){}' – tenfour 2010-09-13 23:46:38

+0

要引用clang:'函數模板的模板參數在C++ 98中不能有默認參數' – BCS 2010-09-14 00:09:15

1

如果您有權訪問C++ 0x以避免所有樣板文件(下面)和一般縮放到任意數量的參數,可能需要查看可變參數模板。

template <typename T1> A(T1 t1) : T(t1) {} 
template <typename T1, typename T2> A(T1 t1, T2 t2) : T(t1, t2) {} 
... 

http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates

+0

這就是我所要做的已經使用,如果我可以:http://digitalmars.com/d/2.0/template.html#TemplateTupleParameter C++ 0x是我的名單上的下一個。這是我堅持的。 – BCS 2010-09-14 00:01:47

+0

C++ 0x在STL中有一個通用的元組容器(它使用可變參數模板構建)。 – David 2010-09-14 00:06:58

+0

元組容器?那將如何需要? – BCS 2010-09-14 00:18:05

0

綜上所述,你不能T()如果T編譯沒有默認構造函數。

相關問題