模板参数在具有相同数据类型的单个typename的构造函数中不起作用

时间:2018-03-02 04:54:21

标签: c++ templates

在尝试使用std::forward时,写了一个简单的person类,它只有nameaddress以及一个初始化它们的构造函数。以下是课程定义。

class person {
   std::string name;
   std::string address;
public:

template<class T1, class T2>
   person(T1&& _name, T2&& _address) : name{ std::forward<T1>(_name) }, 
   address{ std::forward<T2>(_address) } { std::cout << "Template Constructor" << std::endl; }

 // This is not working if passed by rvalue
template<class T>
 person(T&& _name, T&& _address) : name{ std::forward<T>(_name) }, address{ std::forward<T>(_address) } { std::cout << "Single template Constructor" << std::endl; }

};
int main(){

    person p{"john doe","Somewhere"}; // This doesn't work without the template constructor which takes two typenames
    std::string name="user";
    std::string address = "blah";

    person p2{name, address}; // This of course works with just template<class T>.
}

智能感知在没有no constructor of "person" can take two arguments "const char[9], const char[10]"的情况下显示为template<class T1, class T2>错误。为什么这不仅仅是&#34; const char []&#34;和template<class T>一起工作?在这种情况下,有没有办法让template<class T>工作?

1 个答案:

答案 0 :(得分:2)

说你有这个:

template <typename T>
void fn(T&&) {
  // ...
}

int main(int, char**) {
  fn("abc");

  return 0;
}

在我看来,您希望T可以解析为const char []const char *which in this context can be considered the same type)。实际上,T会解析为const char (&) [4],并保留大小信息。这就是为什么你不能使用单个模板构造函数和两个不同大小的C字符串。

如果您尝试使用两个相同大小的C字符串调用单个模板构造函数,您将看到它有效。