模板类中的变量模板 - 意外错误(可能是错误?)

时间:2015-08-17 12:14:13

标签: c++ templates c++14 auto variable-templates

有:

struct Value
{
    template<class T>
    static constexpr T value{0};
};

(0) ideone

template<typename TValue>
struct Something
{
    void x()
    {
        static_assert(TValue::template value<int> == 0, "");
    }
};

int main() { Something<Value>{}.x(); return 0; } 
  • 不使用clang ++ 3.6进行编译。

      

    错误:如果没有模板参数列表,则无法引用变量模板'value'

  • 不使用g ++ 5.2进行编译。

      

    错误:'template constexpr const T Value :: value'不是函数模板

(1) ideone

使用clang ++和g ++进行编译。

struct Something
{
    void x()
    {
        static_assert(Value::template value<int> == 0, "");
    }
};

int main() { Something{}.x(); return 0; } 

为什么(0)无法编译?

如果通过模板参数(在本例中为TValue)访问变量模板,似乎会出现问题。为TValue定义类型别名或使用typename关键字无法解决问题。

这里发生了什么?

2 个答案:

答案 0 :(得分:10)

这绝对是将变量模板视为依赖名称的gcc和clang错误。我提交了gcc 67248clang 24473

作为现在的解决方法,两个编译器都支持旧的变量模板方式,即如果你添加了:

struct Value
{
    template<class T>
    static constexpr T value = 0;

    template <typename T>
    struct variable_template_ish {
        static constexpr T value = Value::value<T>;
    };
};

然后进行以下编译:

template<typename TValue>
struct Something
{
    void foo() {
        static_assert(TValue::template variable_template_ish<int>::value == 0, "");
    }
};

int main() { 
    Something<Value>{}.foo();
}

答案 1 :(得分:0)

在使用c ++创建模板类头文件之前,我有些头疼。

确保static constexpr T value{0};的实现与声明在同一个头文件中。