这是对this问题的跟进。
为什么要编译:
#include <iostream>
class Test {
public:
Test(std::pair<char *, int>) {
std::cout << "normal constructor 2!" << std::endl;
}
};
int main() {
Test t6({"Test", 42});
return 0;
}
但这不是:
#include <iostream>
class Test {
public:
Test(std::pair<char *, int>) {
std::cout << "normal constructor 2!" << std::endl;
}
template<typename ... Tn>
Test(Tn ... args) {
std::cout << "template constructor!" << std::endl;
}
};
int main() {
Test t6({"Test", 42});
return 0;
}
错误讯息:
错误:调用'Test'的构造函数是不明确的
正如我在前一个问题中所理解的那样,非模板构造函数是首选,如果它完全匹配。所以我猜{“Test”,42}与std :: pair不匹配? 如果是这样,什么是正确的方法?我知道有std :: make_pair,但我希望它尽可能短,因为我可以有几个这样的对并每次输入std :: make_pair这将是不利的,因为它会使事情膨胀。那么什么是最短的方式?
答案 0 :(得分:3)
由于你已经在使用c ++ 11,切换到大括号初始化,你的代码将在gcc下编译(至少4.7.2)并按你的意愿行事:
...
int main() {
Test t6{{"Test", 42}};
return 0;
}
$ g++ t.cpp -std=c++11
t.cpp: In function ‘int main()’:
t.cpp:14:25: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
$ a.out
normal constructor 2!