3

当我尝试编译下面的代码时,出现以下错误。

Error: main.cpp: In function "int main()":
       main.cpp:6: error: "display" was not declared in this scope

测试1.h

#include<iostream.h>
class Test
{
  public:
    friend int display();
};

测试1.cpp:

#include<iostream.h>
int  display()
{
    cout<<"Hello:In test.cc"<< endl;
    return 0;
}

主文件

#include<iostream.h>
#include<test1.h>
int main()
{
 display();
 return 0;
}

奇怪的是我能够在 unix 中成功编译。我正在使用 gcc 和 g++ 编译器

4

2 回答 2

3

在将其声明为友元之前,您需要提供该函数的声明。
根据标准,作为朋友的声明不符合实际函数声明的条件。

C++11 标准 §7.3.1.2 [namespace.memdef]:
第 3 段:

[...]如果friend非本地类中的声明首先声明了一个类或函数,则友元类或函数是最内层封闭命名空间的成员。直到在该命名空间范围内(在授予友谊的类定义之前或之后)提供匹配声明之前,通过非限定查找或限定查找都无法找到朋友的名称。[...]

#include<iostream.h>
class Test
{
  public:
    friend int display();  <------------- Only a friend declaration not actual declaration
};

你需要:

#include<iostream.h>
int display();            <------- Actual declaration
class Test
{
  public:
    friend int display();     <------- Friend declaration 
};
于 2013-03-29T06:38:16.723 回答
2

有趣的。看起来in的friend声明算作 g++ 中的实际函数声明。display()test1.h

我认为该标准实际上并未强制执行此操作,因此您可能希望为display()in添加适当的声明test1.h

#include <iostream>

int display();

class Test
{
public:
    friend int display();
};
于 2013-03-29T06:34:27.623 回答