2012-09-10 72 views
2

考慮下面的代碼:C++:初始化列表+模板收率奇怪的錯誤

#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 }); 
    } 

}; 

與單個nullptr類模板Y<T>呼叫X::init與初始化值列表的功能foo。應該工作正常,不是嗎?

然而,我的G ++ 4.6.1抱怨:

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*>&' 

有一次,我從Y刪除模板參數,即讓一個普通的類,一切工作正常。我在做什麼錯了,或者這是一個編譯器錯誤?

+1

在GCC 4.7.1上似乎[work](http://liveworkspace.org/code/bfab5d5ff6a33911b50b4bf1f8f1fd4d)。 – chris

+0

但在GCC 4.5.1上似乎[不工作](http://ideone.com/MzzS9)。 – orlp

+0

我猜這是一個錯誤,如果它的工作方式與更高版本。 – chris

回答

1

這幾乎肯定是一個編譯器錯誤,因爲它可以在更高版本的GCC中使用(請參閱註釋)。我個人沒有看到它不應該起作用的原因。

+0

但它是一個很奇怪的。模板參數從不使用。我不明白爲什麼模板'Y'應該對初始化器列表調用產生任何影響。有gcc的bug修正日誌嗎? – gexicide

+0

@gexicide,這就是C++和C++編譯器的工作原理。只是爲了迷惑你。 – chris

+0

最新的MinGW是否已經包含GCC 4.7? – gexicide