Biorąc pod uwagę następujący kod:dwa różne wyniki na GCC 4.6 i 4.7 dla szablonu szablonu odliczenia
#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 na Windows otrzymujemy:
Version A
Version B
Version C
i GCC 4.7.1 na Linux daje :
Version A
Version B
Version A
Pytanie brzmi: DLACZEGO? Czy jest to błąd, czy niezdefiniowane zachowanie? Czy powinienem opublikować go w raporcie o błędach GCC?
Czy ta nie zapytał wcześniej dzisiaj? – Gorpik
Usunięcie '= size_t' naprawia. – Pubby
@Gorpik: był to w przybliżeniu ten sam kod, ale nie dla tego samego pytania/przyczyny. – Vincent