有:
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
关键字无法解决问题。
这里发生了什么?
答案 0 :(得分:10)
这绝对是将变量模板视为依赖名称的gcc和clang错误。我提交了gcc 67248和clang 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};
的实现与声明在同一个头文件中。