任何人都可以澄清以下原因为何不起作用:
xyz
请注意,如果不使用函数,而是直接编译#include <type_traits>
#include <iostream>
template<typename T, typename U>
constexpr bool is_same_fn()
{
return std::is_same_v<T, U>;
}
template<typename T, std::enable_if_t<is_same_fn<T, int>(), bool> = true>
void fn2() { std::cout << "True mg\n"; }
template<typename T, std::enable_if_t<!is_same_fn<T, int>(), bool> = true>
void fn2() { std::cout << "False mg\n"; }
int main() {
fn2<int>();
fn2<char>();
return 0;
}
作为模板参数,则会编译相同的东西。
我得到的错误是:
std::is_same
语言标准已正确设置为:error C2995: 'void fn2(void)': function template has already been defined
message : see declaration of 'fn2'
error C3861: 'fn2': identifier not found
。
这发生在MSVC 2019版本16.1.6
答案 0 :(得分:0)
这两个函数具有相同的签名,唯一的区别是默认模板参数。要重载函数,重载必须采用不同的参数。
您可以创建一个功能(而不是SFINAEd),而在体内使用if constexpr
,而不是创建两个单独的功能。
答案 1 :(得分:0)
在我报告之后,他们似乎已将其修复:
此问题的修复程序已在16.2 Preview 3中发布!