MSVC2015在过载模板函数中宣布参数类型
MSVC2015 decltype parameter type in overloaded template function
以下程序符合程序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"; }
相关文章:
- 模板参数推导失败,函数参数/参数不匹配
- 有人可以帮助我理解这些参数/参数吗?
- 为什么具有 2 个参数参数的构造函数接受复制对象作为 1 个参数参数?
- 当超出列时,clang格式强制每个参数/参数拥有自己的行?
- 常量和非常量函数作为模板参数参数
- 功能指针参数参数转换为const
- C 从参数参数包创建向量或列表
- C 中函数参数/参数的分辨率
- 操作员[]作为成员函数的正确模板参数/参数是什么?
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- 使用 {} 作为默认参数参数类型
- 将多个cmd.exe参数/参数传递给Shellexecute(ex)
- C 参数参数未更新
- 如何识别模板参数参数是否是模板内结构中另一个类的实例?C++
- 在不使用"new"的情况下实例化参数参数中的对象
- 由 pthread_create() 调用的函数的多个参数 - 参数是函数指针
- 模板模板参数参数名称用法
- 重新定义默认参数:参数 2
- 声明我的成员函数参数/参数