шаблонное объявление друга не работает из-за ошибки компилятора g++ 5.4.0 или плохого кода?

Ниже приведен код C++, который компилируется без ошибок на моем Mac (Xcode 10.2 10E125 / Apple LLVM версии 10.0.1 (clang-1001.0.46.4)), но выдает сообщение об ошибке компилятора (показано ниже) при мой компьютер с Linux (g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609).

Мой вопрос: это ошибка компилятора в g++ 5.4.0, или я делаю что-то не так в своем коде?

Ошибка компилятора из g++ 5.4.0:

$ g++ template_friend.cpp
template_friend.cpp: In instantiation of ‘class SubClass<int>’:
template_friend.cpp:25:23:   required from here
template_friend.cpp:10:10: error: ‘class BaseClass<int>::InnerClassFunctor’ is private
    class InnerClassFunctor
          ^
template_friend.cpp:17:26: error: within this context
 template <class T> class SubClass : public BaseClass<typename BaseClass<T>::InnerClassFunctor >

... и код для воспроизведения ошибки:

template<class T> class BaseClass
{
public:
   BaseClass(int) {}

private:
   template<class HisT> friend class SubClass;

   class InnerClassFunctor
   {
   public:
      InnerClassFunctor() {}
   };
};

template <class T> class SubClass : public BaseClass<typename BaseClass<T>::InnerClassFunctor >
{
public:
   SubClass(int x) : BaseClass<typename BaseClass<T>::InnerClassFunctor >(x) {/* empty */}
};

int main(int, char **)
{
   SubClass<int> table(0);
   return 0;
}

person Jeremy Friesner    schedule 21.04.2019    source источник
comment
Я предполагаю, что это ошибка в gcc. Обходным путем может быть скрытие базы в структуре признаков: godbolt.org/z/Exqod-   -  person chtz    schedule 21.04.2019


Ответы (1)


Хотя стандарт явно не рассматривает этот случай, я думаю, что это ошибка GCC: ни он, ни Clang не реализуют проверка отложенного доступа правильно, и, в частности, у GCC проблемы с параметрами шаблона (и, по-видимому, с аргументами).

person Davis Herring    schedule 21.04.2019