【发布时间】:2019-07-12 22:56:35
【问题描述】:
谁能澄清为什么以下方法不起作用:
#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
语言标准正确设置为:ISO C++17 Standard (/std:c++17)。
这发生在 MSVC 2019 版本 16.1.6
【问题讨论】:
-
什么编译器、版本和命令行?这对我有用,请参阅:wandbox.org/permlink/7cMUXjWcIslirGqe(需要 C++17)
-
@PaulSanders 我认为它不应该工作。我用的是msvc,我会链接一个godbolt链接。
-
MSVC v19 编译得很好:godbolt.org/z/pXveE-
-
这在 MSVC 2017 15.6.7 中对我来说很好用。您是否在项目的属性页中指定了 C++17(C/C++ -> 语言 -> C++ 语言标准)? MS 正在努力合规,希望没有倒退。
-
@PaulSanders 刚刚用我的 VS2017 版本进行了测试 - 工作得很好。我想他们确实已经倒退了。我会报告的,这是一周内第 4 个编译器错误 ;(
标签: c++ templates c++17 constexpr enable-if