c++ - 如何在将内部类作为参数的命名空间中声明友元函数?

标签 c++ inner-classes forward-declaration friend-function

考虑这段代码:

namespace foo {}

class A
{
   class B
   {
   };

   friend int foo::bar( B& );
};

namespace foo
{
   int bar( A::B& )
   {
   }
}

G++ 4.4.3 告诉我:

friendfun-innerclass.cpp:21: error: 'int foo::bar(A::B&)' should have been declared inside 'foo'

但我不能声明:

namespace foo
{
   int bar( A::B& );
}

在 A 类定义之前,因为 A::B 尚未声明。而且我显然不能声明“A类::B”,要声明B类,我必须给出A类的定义,据我所知,“ friend ”声明必须在A类的定义中。

对我来说奇怪的是,如果我将函数“bar()”从 namespace foo 中取出,一切正常。对我来说,在命名空间内有一个函数或不在一个命名空间内会改变编译器是否接受类中的友元函数声明,这似乎违反直觉。

有没有人知道一种方法来正确地构造所有的声明等等来让它工作?

最佳答案

不能按照您想要的方式完成,因为您必须转发声明一个嵌套类 ( which you can't ) 才能为 foo::bar 提供原型(prototype).

作为解决此问题的第一次尝试,我可能会求助于 foo::bar一个函数模板。这样编译器将解析 A 之后的类型和 B是已知的。

测试工具:

namespace foo
{
    template<class B> int bar(B&);
};

class A
{
   class B
   {
       template<class B> friend int foo::bar( B& );
       int n_;
   public:
       B() : n_(42) {}
   };

public:
    B b_;
};

template<class B> int foo::bar(B& b)
{
    return b.n_;
}

int main()
{
    A a;
    foo::bar(a.b_);
}

关于c++ - 如何在将内部类作为参数的命名空间中声明友元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728405/

相关文章:

c++ - 下面显示的代码段中没有省略移动构造函数是否有任何特殊原因?

c++ - 我可以在非 void 返回函数上使用 [[noreturn]] 吗?

objective-c - 任何人都可以举例说明在 Objective-C 中针对普通类而不是类别或协议(protocol)的前向声明吗?

c++ - 前向声明的问题 - 友元函数和线/点类

c++ - 在 catch block 中调用的 GetLastError 产生不正确的值

c++ - 随机数生成器不给我一个随机数

python - 返回函数内部类的 Python 对象实例

java静态内部类初始化错误

具有内部类和方法的 Scala 对象私有(private)范围

c++ - 在 C++ 中转发声明指向结构的指针