猿问

为什么不从构造函数推断模板参数?

我今天的问题很简单:为什么编译器无法像从函数参数中那样从类构造函数中推断模板参数?例如,为什么以下代码无效:


template<typename obj>

class Variable {

      obj data;

      public: Variable(obj d)

              {

                   data = d;

              }

};


int main()

{

    int num = 2;

    Variable var(num); //would be equivalent to Variable<int> var(num),

    return 0;          //but actually a compile error

}

正如我所说,我知道这是无效的,所以我的问题是为什么呢?允许这样做会造成任何重大的语法漏洞吗?是否存在一个实例,该实例不希望使用此功能(推断类型会导致问题)?我只是想了解允许对函数进行模板推断的逻辑,而对于适当构造的类则不是。


慕容3067478
浏览 415回答 3
3回答

阿波罗的战车

由于其他人已解决的原因,您无法执行所要求的操作,但是您可以执行以下操作:template<typename T>class Variable {&nbsp; &nbsp; public: Variable(T d) {}};template<typename T>Variable<T> make_variable(T instance) {&nbsp; return Variable<T>(instance);}出于所有目的和目的,这都是您要的。如果您喜欢封装,可以将make_variable设为静态成员函数。这就是人们所说的命名构造函数。因此,它不仅可以满足您的要求,而且几乎可以满足您的要求:编译器从(命名的)构造函数中推断出模板参数。注意:任何合理的编译器在编写类似以下内容时都会优化掉临时对象Variable<T> v = make_variable(instance);
随时随地看视频慕课网APP
我要回答