c++ - MSVC2015 decltype 重载模板函数中的参数类型

标签 c++ c++11

下面的程序是否兼容 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"; }

关于c++ - MSVC2015 decltype 重载模板函数中的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41001482/

相关文章:

C++:为什么引入 std::vector::data 成员函数?

c++ - 访问类成员

c++ - C++11 中基于 for 的表达式模板和范围

c++ - 使用 LLVM pass 添加内在函数

C++ 协方差意外行为

c++ - 将输出压缩成单行

C++读取文件并转换数据

c++ - 查找竞争条件错误

c++ - 当可移植性很重要时,使用 C++ 0x/TR1 是否安全?

C++:未定义对仿函数重载调用运算符的引用