[non-]Issue with CRTP template code example in GCC 5.2.1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In the below code I am trying to use CRTP to use the static member "value" from the Child class in the Parent class. When compiling the code with g++ 5.2.1 with the "-pedantic" flag, I am able to compile without errors or warning, and on execution both c.print_value(); and Child<int,4>::print_value(); print out 4.


However when compiling the same code with clang++3.7 or icc 14.0.3, I encounter compilation failures. I have provided below the respective compilation error prints, and have mailed the Clang mailing-list as well to ask about this behaviour.

Would kindly request some insight into why this code work in GCC as opposed to the other two compilers.

Best,
Dipto

------------------------------------------
#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();
}
------------------------------------------



=====================================
Clang's 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 prnt_value ()

=======================================
ICC error
=======================================

error: incomplete type is not allowed
    static const int value = DE::value;
                             ^
          detected during:
            instantiation of class "Parent<DE> [with DE=Child<int, 4>]"
            instantiation of class "Child<T, N> [with T=int, N=4]"






[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux