我可以使用本地声明的枚举类作为模板非类型参数吗? (gcc给出了不明确的错误)

时间:2017-02-19 14:08:59

标签: c++ c++11 gcc

以下代码无法在gcc 4.8.1到6.3中编译:

this.getThings()
update={this.updateThing}
update={this.updateThing.bind(this)}

clang 3.9.1和MSVC 2015 SP3编译它没有错误。

如果我将#include <cassert> template<typename T, T X> struct Mode { using type = Mode; using value_type = T; static constexpr value_type value = X; 移动到全局范围,那么它会编译而不会出错。

代码合法吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

我认为问题是,您仍然需要定义Mode::value,正如编译器所说(ODR)。如果我没有弄错的话,这会随着C ++ 17而改变,并且定义不再是强制性的,这解释了为什么它以std=c++1z标志运行。

在&#34;之前编译并运行&#34; std=c++1z

#include <cassert>

template<typename T, T X>
struct Mode {
    using type = Mode;
    using value_type = T;
    static constexpr value_type value = X;

    constexpr operator value_type() const noexcept { return value; }
};

template<typename T, T X> constexpr T Mode<T,X>::value;

int main()
{
    enum class TestEnum { test1, test2 };
    constexpr Mode<TestEnum, TestEnum::test1> test1 = {};
    //constexpr Mode<TestEnum, TestEnum::test2> test2 = {};

    assert(static_cast<TestEnum>(test1) == TestEnum::test1);
}

你可以see it live