【发布时间】:2012-12-17 14:16:15
【问题描述】:
考虑以下代码:
#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;
}
Windows 上的 GCC 4.6.2 提供:
Version A
Version B
Version C
Linux 上的 GCC 4.7.1 提供:
Version A
Version B
Version A
所以问题是:为什么? 这是错误还是未定义的行为? 我应该将它发布在 GCC 错误报告中吗?
【问题讨论】:
-
这不是今天早些时候问的吗?
-
删除
= size_t修复它。 -
@Gorpik :代码大致相同,但问题/原因不同。
标签: c++ templates gcc c++11 metaprogramming