在尝试使用std::forward
时,写了一个简单的person
类,它只有name
和address
以及一个初始化它们的构造函数。以下是课程定义。
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>
工作?
答案 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字符串调用单个模板构造函数,您将看到它有效。