Clang ++ - 3.7 CRTP compilation error "no named member" in parent template argument

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.

+5
source share

Source: https://habr.com/ru/post/1244327/


All Articles