我想要一个非模板类的构造函数,它由一个类型模板化。任何人都可以帮忙吗?
class A
{
public:
static int GetId(){ return 5;}
};
class B
{
public:
B(int id){ _id = id;}
template<typename T>
B() {_id = T::GetId();}
template<typename T>
static B* newB() {return new B(T::GetId());}
private:
int _id;
};
void doSome()
{
B* p1 = B::newB<A>(); //works
B* p2 = new B<A>(); //doesn't compile -- ">>B<< is no template"
}
答案 0 :(得分:5)
构造函数模板的所有模板参数必须是可推导的(或具有默认参数),因为没有语法将模板参数显式传递给构造函数(如您所知)。
有几种可能的方法:
提供类似构造函数的函数模板。您已使用newB
执行此操作,无需强制进行动态分配:
template <class T>
B create() { return B(T::GetId()); }
提供标签类型并通过以下方式对consturctor进行参数化:
template <class T>
struct Tag {};
class B
{
public:
template <class T>
B(Tag<T>) : _id(T::GetId()) {}
};
//usage:
B b(Tag<A>());
答案 1 :(得分:2)
您无法显式指定构造函数模板参数。它必须是免赔额的。
一种解决方案是使用辅助参数:
p
另外,请使用构造函数初始化列表。并注意那些动态分配。如果不需要,请不要使用它。当需要使用智能指针时。