C ++入门手册第5版:C ++模板类参数推导

问题描述

再次使用C ++入门5版第16章:模板。

在书中:

“类模板是用于生成类的蓝图。类模板与函数模板的不同之处在于,编译器无法推断类模板的模板参数类型。相反,我们已经看到很多次使用一个类模板,我们必须在模板名称后面的尖括号内提供其他信息(第3.3节,第97页)。这些额外信息是用于代替模板参数的模板参数列表。“

但是我认为这是不对的:如果模板类具有一个带有一些依赖类型参数的构造函数,那么如果我用该构造函数定义一个对象,则编译器可以推断出模板参数。例如:

template <typename T>
class Add
{
public:
    Add() = default;
    Add(T const&,T const&);
    T operator ()(T const&,T const&)const;
};

template <typename T>
Add<T>::Add(T const& lhs,T const& rhs){}

template <typename T>
T Add<T>::operator()(T const& lhs,T const& rhs)const
{
    return lhs + rhs;
}

int main()
{

    Add(5,7); // the compiler can deduce template arguments here.
    std::cout << Add(0,0)(7,5) << '\n'; // 12

    Add a(1,2); // ok
    std::cout << a(5,-1) << '\n'; // 4 ok

    std::cout << "\ndone!\n";
}
  • 那我是对的吗?我已经在不同的c ++标准上编译了非常好的代码,并且工作正常。

解决方法

那是因为C ++ 17中的CTAD

C ++ Primer 可能不包含C ++ 14/17/20的

新功能。您可以参考https://en.cppreference.com/w/cpp来确认这些功能。