gpt4 book ai didi

c++ - 尝试使用 enable_if 启用 SFINAE 时出现“无法过载”错误

转载 作者:行者123 更新时间:2023-11-28 01:18:01 25 4
gpt4 key购买 nike

我只是尝试使用 std::enable_if 来尝试 SFINAE在 C++ 中。我以为我理解了理论部分,直到我无法编译以下代码。增加这种困惑的是 Visual Studio 和 Linux 上的不同行为。只要您不取消注释 ( Calculator<int> cInt; ),此粘贴的代码就会在 VS 上编译。但是,使用 GCC 它会给我编译错误。我已经在 STL 实现中看到了这种代码,我真的很期待到处都有更标准化的实现。不管怎样,你能检查一下我的理解有哪些不足之处吗?

template<typename T>
class Calculator
{
public:
typename enable_if<is_arithmetic<T>::value, T>::type
addition(T a, T b)
{
return a + b;
}
typename enable_if<!is_arithmetic<T>::value, T>::type
addition(T a, T b)
{
cout << "Default\n";
return a;
}
};

void SFINAE()
{
// Calculator<int> cInt;
}


int main ()
{
SFINAE();
return 0;
}

GCC 8.1 的错误日志:j

doodle.cpp:30:3: error: 'typename std::enable_if<(! std::is_arithmetic<_Tp>::value), T>::type Calculator<T>::addition(T, T)' cannot be overloaded with 'typename std::enable_if<std::is_arithmetic<_Tp>::value, T>::type Calculator<T>::addition(T, T)'
addition(T a, T b)
^~~~~~~~
jdoodle.cpp:25:3: note: previous declaration 'typename std::enable_if<std::is_arithmetic<_Tp>::value, T>::type Calculator<T>::addition(T, T)'
addition(T a, T b)

使用 int 取消注释计算器类初始化时 VS 上的错误日志:

sfinae.h(17): error C3646: 'addition': unknown override specifier
sfinae.h(17): error C2059: syntax error: '('
sfinae.h(18): error C2334: unexpected token(s) preceding '{'; skipping apparent function body

最佳答案

在类中,SFINAE 适用于模板 方法和方法的模板参数。

所以

typename enable_if<is_arithmetic<T>::value, T>::type 
addition(T a, T b)
{
return a + b;
}

无法工作,因为您正尝试将 SFINAE 应用于非模板的方法和针对类的模板参数的测试 ( is_arithmetic<T>::value)。

你应该尝试一下

template <typename U = T>
typename enable_if<is_arithmetic<U>::value, T>::type
addition(T a, T b)
{
return a + b;
}

这样模板就变成了一个带有模板参数(U)的模板默认类型 ( T) 并且您对方法的模板参数进行了 SFINAE 测试。

另一个也一样addition()方法。

避免有人“劫持”你的代码解释错误的模板参数

Calculator<std::string>  cs;

cs.add("a", "b"); // call the Default version
cs.template add<int>("a", "b"); // call the arithmetic version!!!

你可以强加 UT是同一类型

template <typename U = T>
typename std::enable_if<std::is_arithmetic<U>::value
&& std::is_same<T, U>::value, T>::type
addition(T a, T b) // ^^^^^^^^^^^^^^^^^^^^^^^^^
{
return a + b;
}

关于c++ - 尝试使用 enable_if 启用 SFINAE 时出现“无法过载”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964743/

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