非模板类的构造函数中的模板参数

时间:2017-04-04 07:28:06

标签: c++ templates

我想要一个非模板类的构造函数,它由一个类型模板化。任何人都可以帮忙吗?

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"
}

2 个答案:

答案 0 :(得分:5)

构造函数模板的所有模板参数必须是可推导的(或具有默认参数),因为没有语法将模板参数显式传递给构造函数(如您所知)。

有几种可能的方法:

  1. 提供类似构造函数的函数模板。您已使用newB执行此操作,无需强制进行动态分配:

    template <class T>
    B create() { return B(T::GetId()); }
    
  2. 提供标签类型并通过以下方式对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

另外,请使用构造函数初始化列表。并注意那些动态分配。如果不需要,请不要使用它。当需要使用智能指针时。