gpt4 book ai didi

c++ - 为什么 sfinae 过载没有解决

转载 作者:可可西里 更新时间:2023-11-01 16:08:57 26 4
gpt4 key购买 nike

这个版本工作正常:

template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar() { std::cout << "1" << std::endl; }

template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar() { std::cout << "2" << std::endl; }
};

此版本失败:

template<typename T>
struct Foo2
{
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,A>::value>::type >
V bar() { std::cout << "1" << std::endl; }

template<typename U = T, typename V = typename std::enable_if<std::is_same<U,B>::value>::type >
V bar() { std::cout << "2" << std::endl; }
};

与:

error: 'template template V Foo2::bar()' cannot be overloaded with 'template template V Foo2::bar()'

两个版本之间的区别在于第一个版本我直接使用表达式,第二个版本我创建一个模板默认参数并将其用作返回类型。

第二个例子失败的原因是什么?

最佳答案

因为在案例#2 中,两个 bar 被认为是等价的。当consider whether two function templates are equivalent or not ,默认模板参数被忽略;它们不是函数模板签名的一部分。所以他们被认为是

template<typename U, typename V>
V bar() { std::cout << "1" << std::endl; }

template<typename U, typename V>
V bar() { std::cout << "2" << std::endl; }

如您所见,它们实际上是等价的。

(强调我的)

Two function templates are considered equivalent if

  • they are declared in the same scope
  • they have the same name
  • they have identical template parameter lists
  • the expressions involving template parameters in their return types and parameter lists are equivalent

案例#1 之所以有效,是因为返回类型取决于模板参数,并与不同的表达式一起使用;那么它们就被认为是不等价的。

关于c++ - 为什么 sfinae 过载没有解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com