【问题标题】:Template class definition with enable_if causes error带有 enable_if 的模板类定义导致错误
【发布时间】:2016-10-26 12:29:01
【问题描述】:

有人可以帮我理解为什么以下代码无法编译并帮助我修复它:

template< size_t N_1, size_t N_2, typename callable, typename T_out = typename std::result_of<callable>::type, size_t N = N_1 - N_2, std::enable_if_t< N_1>=N_2>* = nullptr>
class A
{
  template<std::size_t... I>
  void foo();
};


template< size_t N_1, size_t N_2, typename callable >
template<std::size_t... I>
void A< N_1, N_2, callable>::foo()
{
}

错误:

error: nested name specifier 'A<N_1, N_2, callable>::' for declaration does not refer into a class, class template or class template partial specialization
    void A< N_1, N_2, callable>::foo()
         ~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.

非常感谢。

【问题讨论】:

标签: c++ templates c++14 enable-if


【解决方案1】:

模板声明的定义需要与声明相匹配。 std::enable_if_t 确实在这里抛出了一个曲线球,但这似乎适用于 gcc 6.2:

template< size_t N_1, size_t N_2, typename callable, typename T_out, size_t N,
      std::enable_if_t< N_1 >= N_2> *p>
template<std::size_t... I>
void A< N_1, N_2, callable, T_out, N, p>::foo()
{
}

【讨论】:

  • 非常感谢!你知道为什么模板参数T_outNenable_if 的参数必须显式声明,而不是使用它们的默认值自动选择吗?
  • 简短的回答是“这就是 C++ 的工作方式”。如果类的模板只有template&lt; size_t N_1, size_t N_2=N_1&gt; class A,如果你要定义template&lt; size_t N_1&gt; template&lt;std::size_t... I&gt; void A&lt; N_1&gt;::foo(),你也会遇到同样的问题。在模板中定义某些内容时必须列出所有模板参数:template&lt; size_t N_1, size_t N_2&gt; template&lt;std::size_t... I&gt; void A&lt; N_1, N_2 &gt;::foo()
  • 当我说 C++ 的这种特性“即使声明了默认值也需要所有模板参数的参数”违反直觉时,我错了吗?
  • 定义模板时需要它们。默认值是在使用模板时的某个地方...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多