MSVC2015在过载模板函数中宣布参数类型

MSVC2015 decltype parameter type in overloaded template function

本文关键字:布参数 参数 类型 函数 MSVC2015      更新时间:2023-10-16

以下程序符合程序C 11?如果是这样,您知道触发它的特定MSVC错误吗?和/或可能的工作?

#include <iostream>
struct A {};
struct B {};
constexpr A aaa = {};
constexpr B bbb = {};
template <typename T>
void foo(T, decltype(aaa)) { std::cout << "a"; }
template <typename T>
void foo(T, decltype(bbb)) { std::cout << "b"; }
// ^ C2995 'void foo(T,unknown-type)': function template has already been defined
int main()
{
    foo(0, aaa);
    foo(0, bbb);
}

如果实际类型代替了decltype,则可以正常工作,但是实际上,这些类型太复杂了,无法复制,我宁愿不为其别名。

对我有用(VS 2015/V140),并进行以下次要修改:

#include <iostream>
struct A {};
struct B {};
constexpr A aaa = {};
constexpr B bbb = {};
using A_type = decltype(aaa);
using B_type = decltype(bbb);
template <typename T>
void foo(T, A_type) { std::cout << "a"; }
template <typename T>
void foo(T, B_type) { std::cout << "b"; }
int main()
{
    foo(0, aaa);
    foo(0, bbb);
}

但是,这种变体会产生相同的错误(不确定该怎么做):

template <typename T>
struct TypeWrapper {
    using type = T;
};
template <typename T>
void foo(T, typename TypeWrapper<decltype(aaa)>::type) { std::cout << "a"; }
template <typename T>
void foo(T, typename TypeWrapper<decltype(bbb)>::type) { std::cout << "b"; }