模板化的朋友声明在g ++ 5.4.0下不起作用-编译器错误或错误代码?

时间:2019-04-21 03:58:00

标签: c++ templates g++ language-lawyer friend

下面是一些在我的Mac上无错误编译的C ++代码( 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;
}

1 个答案:

答案 0 :(得分:2)

尽管该标准并未明确解决这种情况,但我认为这是一个GCC错误:它和Clang均未正确实现deferred access checking,尤其是GCC在模板参数(显然还有参数)方面遇到了麻烦