如何将全局范围函数声明为命名空间 class 的友元?
How to declare a global-scope function a friend to a namespaced class?
下面的代码在namespace Namespace
.
中定义了class Foo
// main.cpp
#include <csignal>
namespace Namespace
{
class Foo
{
private:
void doSomething() {};
friend void func( union sigval );
};
}
static Namespace::Foo foo;
void func( union sigval sv ) {
(void)sv;
foo.doSomething();
}
我想让 void func( union sigval )
成为这个 class 的朋友,这样它就可以调用私有函数。 执行此操作的正确语法是什么?以上失败并出现以下错误 :
$ g++ --version && g++ -g ./main.cpp
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
./main.cpp: In function ‘void func(sigval)’:
./main.cpp:22:19: error: ‘void Namespace::Foo::doSomething()’ is private within this context
foo.doSomething();
^
./main.cpp:11:8: note: declared private here
void doSomething() {};
^~~~~~~~~~~
这个变化...
friend void ::func( union sigval );
...导致此错误:
$ g++ -g main.cpp
main.cpp:13:34: error: ‘void func(sigval)’ should have been declared inside ‘::’
friend void ::func( union sigval );
^
您可以仅使用 ::
引用全局范围。所以你的好友声明可以是:
friend void ::func( union sigval );
但是不要忘记在 class!
中引用它之前转发声明该函数
所以在全局范围内你需要:
void func( union sigval );
在 class 声明之前。
下面的代码在namespace Namespace
.
class Foo
// main.cpp
#include <csignal>
namespace Namespace
{
class Foo
{
private:
void doSomething() {};
friend void func( union sigval );
};
}
static Namespace::Foo foo;
void func( union sigval sv ) {
(void)sv;
foo.doSomething();
}
我想让 void func( union sigval )
成为这个 class 的朋友,这样它就可以调用私有函数。 执行此操作的正确语法是什么?以上失败并出现以下错误 :
$ g++ --version && g++ -g ./main.cpp
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
./main.cpp: In function ‘void func(sigval)’:
./main.cpp:22:19: error: ‘void Namespace::Foo::doSomething()’ is private within this context
foo.doSomething();
^
./main.cpp:11:8: note: declared private here
void doSomething() {};
^~~~~~~~~~~
这个变化...
friend void ::func( union sigval );
...导致此错误:
$ g++ -g main.cpp
main.cpp:13:34: error: ‘void func(sigval)’ should have been declared inside ‘::’
friend void ::func( union sigval );
^
您可以仅使用 ::
引用全局范围。所以你的好友声明可以是:
friend void ::func( union sigval );
但是不要忘记在 class!
中引用它之前转发声明该函数所以在全局范围内你需要:
void func( union sigval );
在 class 声明之前。