考虑以下代码:
#include <stdio.h>
class A
{
friend void foo(){ printf("%d\n",_a); }
public:
A(int);
private:
static const int _a=5;
};
class B
{
friend void foo(){ printf("%d\n",_a); }
private:
static const int _a=6;
};
int main()
{
foo();
}编译后,我有以下错误:
an_test.cpp:14:14: error: redefinition of ‘void foo()’
an_test.cpp:5:14: error: ‘void foo()’ previously defined here
an_test.cpp: In function ‘int main()’:
an_test.cpp:21:6: error: ‘foo’ was not declared in this scope
make: *** [an_test.o] Error 1我认为用友元说明符定义的函数是外部链接。那么为什么没有在这个作用域中声明an_test.cpp:21:6: error:‘foo’呢?
发布于 2014-05-13 12:23:24
我认为你混淆了链接和作用域。在您的代码中,两个定义的foo()作用域都在各自的类中,因此main()看不到它们的定义。
如果您希望foo()在main()中可见,则需要将其声明移到外部,并在类内部进行friend声明。
#include <stdio.h>
class A
{
friend void foo(A a);
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a){ printf("%d\n",a._a); }
int main()
{
foo(A(5));
}下面的代码也可以,其中定义在内部,外部有一个声明。
#include <stdio.h>
class A
{
friend void foo(A a){ printf("%d\n",a._a); }
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a);
int main()
{
foo(A(5));
}发布于 2014-05-13 12:36:02
我发现了一些关于C++好友函数的信息,它们可能会帮助您了解错误发生的原因:
C++ Friend Functions
请注意:
类的友元函数在该类的作用域之外定义,但它有权访问该类的所有私有和受保护的成员。即使友元函数的原型出现在类定义中,友元函数也不是成员函数。朋友可以是函数、函数模板或成员函数,也可以是类或类模板,在这种情况下,整个类及其所有成员都是朋友。
发布于 2014-05-13 15:43:44
https://stackoverflow.com/questions/23622718
复制相似问题