我有一个这样的课程:
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);
}
//...
需要可以构造任何一组args,基类可以用:
构造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 <> A() : T() {}
无法编译
A() : T() {}
如果T没有默认构造函数,即使没有调用A(),也会失败。
}
有没有办法让A()
成为没有任何参数的模板?
答案 0 :(得分: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 :: g()或Z :: f()。 ]
这意味着,据我所知,不仅类模板中的模板方法被“懒惰地”实例化,而且常规成员也是如此。
答案 1 :(得分: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
答案 2 :(得分:0)
如果T
没有默认构造函数,那么您实际上没有任何选项。在这种情况下,A() : T() { }
是一个明显的错误。更全面地了解您所处的情况,也许有更好的方式/更少复杂的方式完全实现这一目标。
答案 3 :(得分:0)
总而言之,如果T()
没有默认构造函数,则无法编译T
。