【问题标题】:Two different results on GCC 4.6 and 4.7 for template template deductionGCC 4.6 和 4.7 上模板模板推导的两个不同结果
【发布时间】: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


【解决方案1】:

这看起来像是 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:

【讨论】:

  • 你能把这个错误报告给 GCC 吗?
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多