繁体   English   中英

构造函数采用 std::array 时无法推断 class 中的类型

[英]Unable to deduce type in class with constructor taking std::array

我正在尝试创建一个模板化的 class 包含枚举字符串对并且无法进行类型推断。 使用以下代码我有两个问题:

namespace {
template<typename T, size_t S>
using EnumStringArray = std::array<std::pair<T, const char*>, S>;
}

template<typename T, size_t S>
class EnumToString {
public:
    constexpr EnumToString(const EnumStringArray<T, S>& array) :
            _array(array)
    {}
private:
    EnumStringArray<T, S> _array;
};

template<typename T, size_t S>
EnumToString(const EnumStringArray<T, S>&) -> EnumToString<T, S>;

enum MyEnum {
    One, 
    Two
};

constexpr EnumToString enumStrings = {{{    //<---- does not compile without explicit types
        {One, "One"},
        {Two, "Two"}
}}};
  1. 为什么编译器不能在构造函数中自己推导出 EnumToString 的参数?
  2. 为什么用户扣除指南没有帮助?

{..}没有类型并且不能被推断(除了std::initializer_list<T>T(&)[N] )。

所以常规的构造函数或推导指南对 CTAD 没有帮助。

正如@Jarod42 所提到的,原因是在 C++ 中,大括号初始值设定项没有任何类型,并且编译器无法在模板上下文中推断出。 其原因已此进行了总结。

要修复它,您可以使用auto变量来推断类型,然后将其传递给您的模板方法。

auto x = {{One, "One"}, {Two, "Two"}};
// Now x has a type, you can pass it to a template function. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM