Имея (возможно ошибка?):переменной шаблона в шаблон класса - непредвиденная ошибка
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; }
Не компилировать с лязгом ++ 3,6.
error: cannot refer to variable template 'value' without a template argument list
Не компилируется с g ++ 5.2.
error: ‘template constexpr const T Value::value’ is not a function template
(1) ideone
компилирует с обоими лязг ++ и G ++.
struct Something
{
void x()
{
static_assert(Value::template value<int> == 0, "");
}
};
int main() { Something{}.x(); return 0; }
Почему (0) не компилировать?
Похоже, что проблема возникает, если шаблон переменной доступен через параметр шаблона (в данном случае TValue
). Определение псевдонима типа для TValue
или с использованием ключевого слова typename
не устраняет проблему.
Что здесь происходит?
Что такое 'template static constexpr T value {0};' предполагается делать? Это что-то новое? Как это называется? –
@ BЈовић, Он называется * переменным шаблоном *, добавленным в C++ 14. См. [This] (https://en.wikipedia.org/wiki/C%2B%2B14#Variable_templates) (wiki) и [this] (http://en.cppreference.com/w/cpp/language/variable_template) (cppreference) – Nawaz
(0) терпит неудачу для меня на clang 3.6, с «не может ссылаться на шаблон переменной« значение »без списка аргументов шаблона» – Barry