C++ C++;:初始值设定项列表+;模板产生奇怪的错误
考虑以下代码:C++ C++;:初始值设定项列表+;模板产生奇怪的错误,c++,templates,compiler-errors,initializer-list,C++,Templates,Compiler Errors,Initializer List,考虑以下代码: #include <initializer_list> struct X{ static void init(const std::initializer_list<void*>& ptrs){} }; template <typename T> struct Y{ static void foo(){ X::init({ nullptr }); } }; 一旦我从Y中删除模板参数
#include <initializer_list>
struct X{
static void init(const std::initializer_list<void*>& ptrs){}
};
template <typename T>
struct Y{
static void foo(){
X::init({ nullptr });
}
};
一旦我从
Y
中删除模板参数,即使其成为一个普通类,一切正常。我做错了什么,或者这是一个编译器错误?这几乎肯定是一个编译器错误,因为它可以在以后的GCC版本中工作(请参阅注释)。我个人看不出它不起作用的原因。似乎在GCC 4.7.1上起作用,但似乎在GCC 4.5.1上起作用。我猜,如果它在更高版本中工作时是这样的话,那就是一个bug。但这是一个非常奇怪的bug。从未使用模板参数。我不明白为什么模板化Y
会对初始值设定项列表调用产生任何影响。GCC有一个Bug固定日志吗?@ GeXEng杀人,这就是C++和C++编译器的工作原理。只是想让你困惑。@gexicide,我用这个:。它工作得非常好,还包括其他有用的东西,如boost。@chris:迁移到此发行版的最佳方式是什么?先卸载旧版本,或者我可以简单地在旧版本上安装它吗?@gexicide,您使用哪种编译器?它带有指令,但对于代码块,我所要做的就是用这个重命名为那个来替换MinGW
。
test11.cpp: In static member function 'static void Y<T>::foo()':
test11.cpp:12:23: error: no matching function for call to 'X::init(<brace-enclosed initializer list>&)'
test11.cpp:12:23: note: candidate is:
test11.cpp:5:15: note: static void X::init(const std::initializer_list<void*>&)
test11.cpp:5:15: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const std::initializer_list<void*>&'