依赖范围内的功能之友

uh *_*per 8 c++

这段代码无效:

template <class T> struct A;

class C {
    template <class T> friend void A<T>::foo();
};
Run Code Online (Sandbox Code Playgroud)

在GCC 6.1.0中它说:

error: member 'void A<T>::foo()' declared as friend before type 'A<T>' defined

     template <class T> friend void A<T>::foo();
Run Code Online (Sandbox Code Playgroud)

Clang 3.8.0:

warning: dependent nested name specifier 'A<T>::' for friend class declaration 
is not supported; turning off access control for 'C' [-Wunsupported-friend]
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2015崩溃:

fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\template.cpp', line 8952)
        template <class T> friend void A<T>::foo();
Run Code Online (Sandbox Code Playgroud)

更具体地说,A需要在朋友声明之前定义?

  template <class T> struct A;

  class C {
    static void foo();
    template <class T> friend void A<T>::f();
  };

  template <class T> struct A {
    void f() { }
  };
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么?

Oeb*_*ele 4

你指的是A成员函数foo。目前尚不知道该函数是否存在,因为您仅转发声明A

换句话说,您必须声明A<T>::foobefore C,正如 GCC 消息试图告诉您的那样(其他两个相当神秘)。这意味着您必须声明Abefore的完整接口C,而不是仅向前声明它。