【问题标题】:Issue with multiple overloads using enable_if [duplicate]使用 enable_if 的多个重载问题 [重复]
【发布时间】:2020-04-19 22:22:28
【问题描述】:
template <typename T,  typename = enable_if_t<is_same<T, int>::value>>
void qw(T t) 
{
  std::cout << "int " << endl;
}

template <typename T , typename =  enable_if_t<is_same<T, float>::value>>
void qw(T t) 
{
   cout << "float" << endl;
}

// Invoked from main as 
int main()
{
   int x = 10;
   qw(x);
}

我在使用 g++9.2 时遇到的错误

sp.cc:153:6: error: redefinition of ‘template<class T, class> void qw(T)’
  153 | void qw(T t)
      |      ^~
sp.cc:147:6: note: ‘template<class T, class> void qw(T)’ previously declared here
  147 | void qw(T t)

我假设只有一个重载格式良好并且会被选中。然而,它抱怨有多种定义。有人可以帮忙解释为什么吗?

【问题讨论】:

    标签: c++ templates c++17 sfinae template-specialization


    【解决方案1】:

    来自cppreference,其中有这个例子作为注释:

    一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板。这不起作用,因为声明被视为同一函数模板的重新声明(默认模板参数不计入函数模板等效项)。

    所以你需要做的不是让 sfinae 的类型成为默认参数。相反,您可以将其解析为某种类型,例如int,并给它一个默认值,像这样:

    template <typename T, enable_if_t<is_same_v<T, int>, int> = 0>
    void qw(T t)  
    {
      std::cout << "int " << endl;
    }
    
    template <typename T, enable_if_t<is_same_v<T, float>, int> = 0>
    void qw(T t) 
    {
       cout << "float" << endl;
    }
    

    【讨论】:

    • 以上工作正常。为了更好地理解,在这种情况下,我们是否也重新定义了模板,只有默认 value 不同,即两者都具有与 int 相同的第二个模板参数,其中之一他们被 SFINAE 淘汰了?
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多