Templated class does no compile using the latest intel compiler

Viewed 63

The following snippet compiles using the intel icc 2021.2.0 and clang without any warning. But it does not compile icc 2021.3.0 or gcc 11.1 throwing the error

#include <array>

class Base {
  public:
    enum Types { Al, Mg };
    static constexpr unsigned int P = 2;
    static constexpr unsigned int bin_Al = 1;
    static constexpr unsigned int bin_Mg = 300;

    static constexpr std::array<unsigned int, P> bins{bin_Al, bin_Mg}; 
    Base();
};

template <typename Base::Types pNo>
class Derived : public Base {
  public:
    Derived();
  public:
    static std::array<double, bins[pNo]> particle_radii;
};

template <typename Base::Types pNo>
std::array<double, Base::bins[pNo]> Derived<pNo>::particle_radii;

Error:

error: conflicting declaration 'std::array<double, pNo->Base::bins.std::array<unsigned int, 2>::operator[]()> Derived<pNo>::particle_radii'
23 | std::array<double, Base::bins[pNo]> Derived<pNo>::particle_radii;

note: previous declaration as 'std::array<double, pNo->Base::bins.std::array<unsigned int, 2>::operator[]()> Derived<pNo>::particle_radii'
19 |     static std::array<double, bins[pNo]> particle_radii;

Here is the godbold example.

If I change the std::array to a POD double array, it compiles fine.

Can somebodt explain me why this is not compiling using some compilers?

0 Answers
Related