2012-12-17 13 views
5

Considerando il seguente codice:due risultati diversi su GCC 4.6 e 4.7 per i template deduzione

#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 su Windows dà:

Version A 
Version B 
Version C 

e GCC 4.7.1 su Linux dà :

Quindi la domanda è: PERCHE '? Si tratta di un bug o di un comportamento non definito? Devo postarlo sul bug report di GCC?

+2

non era questo ha chiesto prima di oggi? – Gorpik

+0

La rimozione di '= size_t' lo corregge. – Pubby

+0

@Gorpik: era approssimativamente lo stesso codice, ma non per la stessa domanda/ragione. – Vincent

risposta

4

Sembra un errore in gcc 4.7.x (4.7.2 ha lo stesso problema). Ecco un esempio semplice:

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 fallisce con:

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

Puoi segnalare questo bug a GCC? – Vincent

+2

Ho segnalato il bug qui: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55724 – Vincent

Problemi correlati