【发布时间】:2017-12-15 11:31:57
【问题描述】:
我正在尝试使用 g++ 编译以下代码(从实际使用中简化):
namespace A {
class B;
}
A::B operator+(A::B a, A::B b);
namespace A {
class B {
private:
int i;
public:
B() : i(0) {}
B(int j) : i(j) {}
friend B ::operator+(B a, B b);
};
}
A::B operator+(A::B a, A::B b) {
return A::B(a.i + b.i);
}
int main() {
A::B a(1), b(2);
A::B c = a+b;
return 0;
}
据我所知,B 类中的朋友声明是正确的,并且需要 :: 全局范围声明,否则编译器会假定 A::operator+(B a, B b) 的意思。
然而,在编译这个时,gcc 给出了错误信息
ISO C++ forbids declaration of ‘operator+’ with no type
我不知道如何解决这个问题。之后的错误消息给人的印象是 gcc 忽略了该行中 B 和 :: 之间的空格,而是将其解释为 B 的成员函数的朋友声明。我该如何告诉它我想要什么?
【问题讨论】:
-
通常我会在类内部声明友元函数,我只会像友元 int operator+() 一样声明它,而在类外部,我可以像 int B::operator+ 一样定义它() .. 不知道这是否适用于你的情况
-
@SIMEL:与我无关:这里没有
const& T。 -
不知道为什么您的代码不起作用(因为在另一个命名空间中移动
operator+是有效的),但您可以使用 that,这无论如何都更惯用。 -
编译器确实忽略了
B和::之间的空格。那是因为空间无关紧要:您可以将所有提到的A::B替换为A :: B而不会改变含义。您可以在类名和范围限定符之间放置空格。这不是您遇到此问题的原因。
标签: c++ function class namespaces friend