2012-12-17 64 views
5

考慮下面的代碼:兩種不同的結果模板模板扣除

#include <iostream> 
#include <vector> 
#include <array> 
#include <type_traits> 

// Version A 
template<typename T> 
void f(const T& x) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<typename... T1, template<typename...> class T> 
void f(const T<T1...>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

// Version C 
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N> 
void f(const T<T1, N...>& x) 
{ 
    std::cout<<"Version C"<<std::endl; 
} 

// Main 
int main(int argc, char* argv[]) 
{ 
    f(double()); 
    f(std::vector<double>()); 
    f(std::array<double, 3>()); 
    return 0; 
} 

GCC 4.6.2在Windows上給出了:

Version A 
Version B 
Version C 

和GCC 4.7.1在Linux上給:

Version A 
Version B 
Version A 

所以問題是:爲什麼? 這是一個錯誤還是一個未定義的行爲? 我應該將它發佈在GCC錯誤報告上嗎?

+2

不是今天這個剛纔問? – Gorpik

+0

刪除'= size_t'修復了它。 – Pubby

+0

@Gorpik:它的代碼大致相同,但不是相同的問題/原因。 – Vincent

回答

4

它看起來像gcc 4.7.x中的錯誤(4.7.2有同樣的問題)。這裏有一個簡單的例子:

template<int N> struct S {}; 
template<typename T = int, T N> void f(S<N>) {} 
int main() { S<1> s; f(s); } 

GCC 4.7.2失敗:

source.cpp:3:25: error: no matching function for call to 'f(S<1>&)' 
source.cpp:3:25: note: candidate is: 
source.cpp:2:38: note: template<class T, T N> void f(S<N>) 
source.cpp:2:38: note: template argument deduction/substitution failed: 
+1

你能舉報這個bug到GCC嗎? – Vincent

+2

我在這裏報告了這個錯誤:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55724 – Vincent