考慮下面的代碼:兩種不同的結果模板模板扣除
#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錯誤報告上嗎?
不是今天這個剛纔問? – Gorpik
刪除'= size_t'修復了它。 – Pubby
@Gorpik:它的代碼大致相同,但不是相同的問題/原因。 – Vincent