Having:
struct Value
{
template
static constexpr T value{0};
};
(0) ideone
te
I've had some headaches before when creating template class header files in c++.
Make sure you implementation of static constexpr T value{0};
is in the same header file as the declaration.
This is definitely a gcc and clang bug in their treatment of variable templates as dependent names. I submitted gcc 67248 and clang 24473.
As a workaround for now, both compilers support the old way of doing variable templates, namely if you added:
struct Value
{
template<class T>
static constexpr T value = 0;
template <typename T>
struct variable_template_ish {
static constexpr T value = Value::value<T>;
};
};
then the following compiles:
template<typename TValue>
struct Something
{
void foo() {
static_assert(TValue::template variable_template_ish<int>::value == 0, "");
}
};
int main() {
Something<Value>{}.foo();
}