2010-09-13 109 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编译没有默认构造函数。

相关问题