ima*_*ett 4 variadic-functions initializer-list c++11
我在使用std :: initializer_list时遇到了麻烦.我把它简化为一个简单的例子:
#include <initializer_list>
#include <cstdio>
class Test {
public:
template <typename type> Test(const std::initializer_list<type>& args) {}
};
int main(int argc, char* argv[]) {
Test({1,2});
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用时编译g++ test_initializer.cpp -std=c++0x,编译并运行良好.但是,如果第11行更改为Test({1,2.0});,则获得:
ian@<host>:~/Desktop$ g++ test_initializer.cpp -std=c++0x
test_initializer.cpp: In function ‘int main(int, char**)’:
test_initializer.cpp:11:14: error: no matching function for call to ‘Test::Test(<brace-enclosed initializer list>)’
test_initializer.cpp:11:14: note: candidates are:
test_initializer.cpp:7:28: note: template<class type> Test::Test(const std::initializer_list<_Tp>&)
test_initializer.cpp:5:7: note: constexpr Test::Test(const Test&)
test_initializer.cpp:5:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const Test&’
test_initializer.cpp:5:7: note: constexpr Test::Test(Test&&)
test_initializer.cpp:5:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘Test&&’
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为编译器无法确定使用什么类型的初始化列表.有没有办法修复示例,以便它适用于不同的类型(并仍然使用初始化列表)?
一个std::initializer_list只需要一个类型.如果您需要不同的类型,可以使用可变参数模板:
template<typename... Args>
Test(Args&&... args);
/* ... */
int main()
{
Test(1, 2.0);
}
Run Code Online (Sandbox Code Playgroud)