模板和std :: pair list-initialization

时间:2014-01-03 01:52:08

标签: c++ templates

这是对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这将是不利的,因为它会使事情膨胀。那么什么是最短的方式?

1 个答案:

答案 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!