In the code below, I'm trying to use CRTP to use the value of a static member from the Child class in the Parent class. When compiling code with g ++ 5.2.1 with the "-pedantic" flag, I can compile as expected, and when executed as c.print_value();
, and so Child<int,4>::print_value();
print 4.
#include <iostream> template <typename DE> struct Parent { static const int value = DE::value; static void print_value () { std::cout << "Value : " << value << '\n'; } }; template <typename T, int N> struct Child : Parent< Child<T,N> > { static const int value = N; }; int main () { Child<int,4> c; c.print_value(); Child<int,4>::print_value(); }
However, when compiling the same code with clang ++ 3.7, I encounter compilation errors.
crtp_clang_error.cpp:9:32: error: no member named 'value' in 'Child<int, 4>' static const int value = DE::value; ~~~~^ crtp_clang_error.cpp:27:16: note: in instantiation of template class 'Parent<Child<int, 4> >' requested here struct Child : Parent< Child<T,N> > ^ crtp_clang_error.cpp:38:16: note: in instantiation of template class 'Child<int, 4>' requested here Child<int,4> c; ^ crtp_clang_error.cpp:40:3: error: no member named 'print_value' in 'Child<int, 4>'; did you mean 'Parent<Child<int, 4> >::print_value'? Child<int,4>::print_value(); ^~~~~~~~~~~~~~~~~~~~~~~~~ Parent<Child<int, 4> >::print_value crtp_clang_error.cpp:11:15: note: 'Parent<Child<int, 4> >::print_value' declared here static void print_value ()
I'm not sure if this is a Clang ++ bug or a GCC hack. I would be very grateful for your understanding.
source share