这段代码无效:
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)
如果是这样,为什么?
你指的是A成员函数foo。目前尚不知道该函数是否存在,因为您仅转发声明A。
换句话说,您必须声明A<T>::foobefore C,正如 GCC 消息试图告诉您的那样(其他两个相当神秘)。这意味着您必须声明Abefore的完整接口C,而不是仅向前声明它。