具有自定义返回类型的全局命名空间中的友元函数

friend function in global namespace with custom return type

本文关键字:友元 函数 命名空间 全局 自定义 返回类型      更新时间:2023-10-16

我想从全局命名空间创建一个类的友元函数,这似乎工作得很好,除非友元函数使用像这样的自定义返回类型:

typedef int Type;
Type myFunction();
namespace foo {
class Foo
{
 public:
    friend Type ::myFunction();
 private:
    void bar() {}
};
}
Type myFunction()
{
    foo::Foo a;
    a.bar();
    return 0;
}

如果使用int而不是Type,则代码编译,但使用typedef时,编译器似乎没有将类型与名称空间分开,并给出错误:

error: expected a class or namespace
        friend Type ::myFunction();
               ^
error: C++ requires a type specifier for all declarations
        friend Type ::myFunction();

我在OS X上使用clang++ 500.2.79。我可以在示例中使用#define而不是typedef作为解决方案,但在我的实际问题中,自定义类型来自另一个头文件,无法更改。

这在GCC中工作,但在VS13中不起作用,或者如您所说,在clang++中不起作用。但是,这修复了VS13中的问题:

friend Type (::myFunction());