【问题标题】:Hide function definition with enable_if [duplicate]使用 enable_if 隐藏函数定义
【发布时间】:2018-03-18 18:52:23
【问题描述】:

谁能帮我理解为什么下面的代码不能编译:

#include <type_traits>

class A{};
class B{};


template< typename T >
class C
{
  template< typename = std::enable_if_t<std::is_same<T, A>::value > >
  void foo()
  {}

  template< typename = std::enable_if_t<std::is_same<T, B>::value > >
  void foo()
  {}
};

错误信息:

t.cpp:15:8: error: class member cannot be redeclared
  void foo()
       ^
t.cpp:11:8: note: previous declaration is here
  void foo()
       ^
1 error generated.

我希望始终只有一个foo 定义处于活动状态; T 的第一个等于AT 的第二个等于B

如果有人可以帮助我修复代码,那就太好了。

【问题讨论】:

    标签: c++ c++14 sfinae typetraits enable-if


    【解决方案1】:

    直接来自cppreference,强调我的:

    一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且用相同的签名声明两个不同的函数模板是非法的。

    简单来说,两个函数的签名都是:

    template<typename>
    void foo()
    

    【讨论】:

    • 非常感谢!我将template&lt; typename = std::enable_if_t&lt;std::is_same&lt;T, A&gt;::value &gt; &gt; 固定为template&lt; std::enable_if_t&lt;std::is_same&lt;T, A&gt;::value, T* &gt; &gt; = nullptr,它现在可以编译并计算正确的结果。这对我来说就像一个肮脏的黑客。可能有更优雅的解决方案吗?
    • @abraham_hilbert 这将解决双重声明问题,但它不能作为 SFINAE 工作。您是否尝试过实际实例化C
    • 是的。实际上,我的代码高兴地有点复杂,……。像这样:template&lt; typename U, std::enable_if_t&lt;std::is_same&lt;T, A&gt;::value, U* &gt; = nullptr &gt; void foo(U) { /* ... */ }
    猜你喜欢
    • 2021-12-26
    • 2015-02-06
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多