19

有:

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 编译。

    错误:不能在没有模板参数列表的情况下引用变量模板“值”

  • 不使用 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关键字并不能解决问题。

这里发生了什么?

4

2 回答 2

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();
}
于 2015-08-17T12:55:00.703 回答
0

之前在 C++ 中创建模板类头文件时,我有些头疼。

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

于 2015-08-17T12:57:35.200 回答