假设我有一个头文件a.h和一个源文件a.cpp。当我尝试编译它并从包含a.h的不同文件(例如main.cpp)调用what()时:
A.H:
class A {
friend void what();
public:
int index;
};
a.cpp:
#include "a.h"
#include <iostream>
void what() {
std::cout << "what" << std::endl;
}
失败,正如所料(错误:'什么'未在此范围内声明)。但是,当我对此做同样的事情时:
A.H:
class A {
friend void what(A *thing);
public:
int index;
};
a.cpp:
#include "a.h"
#include <iostream>
void what(A *thing) {
std::cout << thing->index << std::endl;
}
它在g ++ 4.4.1上编译并运行得很好(假设“索引”已经初始化了)。我对C ++知之甚少,但我认为,通过将对象指针传递给函数,函数以某种方式可用于全局范围(即获得“提升”以便能够“看到”对象以前存在于与它相同的范围内)。我还没有尝试过其他类型的函数,但是,当使用g ++和friend函数时,我得到了这种行为。这应该发生在C ++中吗?
谢谢,对不起,如果这是一个讽刺的问题,我的朋友谷歌让我失望了。
答案 0 :(得分:0)
我认为你在课堂宣言结束时忘记了;
。
以下代码对我来说非常合适(gcc 4.4.5)
A.H
class A {
friend void what();
private:
int index;
};
a.cpp
#include <iostream>
#include "a.h"
using namespace std;
void what()
{
cout << "what" << endl;
}
int main()
{
what();
return 0;
}
<强>更新强>
您应该在what
类声明之前在a.h
头文件中声明A
函数。
答案 1 :(得分:0)
我用g ++ 4.5.1编译了你的代码,没有报告错误。