【问题标题】:Friend function not declared in this scope error未在此范围错误中声明的友元函数
【发布时间】:2013-05-27 20:17:34
【问题描述】:

您好,我正在尝试了解友元函数的范围,但出现“未在范围内声明”错误。这是我的代码:

//node.h
class Node{

public:

  int id;
  int a;
  int b;

  friend int add(int,int);

  void itsMyLife(int);
  Node();
};

//node.cpp
Node::Node(){
  a=0;
  b=0;
  id=1;
}

void Node::itsMyLife(int x){

  cout<<"In object "<<id<<" add gives "<<add(x,a)<<endl;

}

//routing.cpp
#include "node.h"

int add(int x, int y){

     return x+y;
}

//main.cpp
#include "node.h"

int main(){

return 0;
}

我在 node.cpp 中收到错误“添加未在此范围内声明”。当我在类范围内声明函数时,为什么会出现此错误?任何帮助将不胜感激。谢谢

【问题讨论】:

  • AFAIK 好友声明也是前向声明。如果我是对的,就不应该有错误。也许它认为它在类范围内(尽管这对于友元函数没有多大意义),尝试在友元声明中添加 :: 之前添加它以声明它在全局范围内而不是类范围内。也许会有所帮助。
  • 实际上如果我在node.cpp中定义了add函数,问题就消失了。但我想在一个单独的文件中定义它。我该怎么做?

标签: c++ declaration friend-function


【解决方案1】:

在您的节点类中,您声明了一个友元函数 int add (int, int)。但是目前编译器还没有遇到这个函数,所以还是未知数。

您可以为您的添加功能制作单独的头文件和源文件。然后在 node.h 中包含新的标题。因为在您声明 Node 的文件中,函数 add 目前是未知的。

因此,您可以创建一个 add.h 和一个 add.cpp 文件,并在声明 Node 之前包含 add.h。不要忘记编译 add.cpp。

【讨论】:

  • 感谢您的回复,但这不是我问题的目的。我想知道在类中已经声明友元函数的情况下,为什么成员函数不能调用友元函数?实际上我想在成员函数中调用友元函数,友元函数必须访问类的一些私有成员变量(为简单起见,代码中未显示)。谢谢
【解决方案2】:

这是 Linux 端的一个错误。代码应该可以工作。我现在有在 Windows 端编译良好的代码,当我将它移到 Linux 端时,我得到了同样的错误。显然,您在 Linux 端使用的编译器没有看到/使用头文件中的朋友声明,因此会出现此错误。 通过在 C++ 文件中使用该函数之前简单地移动友元函数的实现(例如:可能在函数回调分配中使用),这解决了我的问题,也应该解决你的问题。

最好的问候

【讨论】:

  • 之前的评论应该是:这是Linux端的一个bug。代码应该按照编写的方式工作。我现在有在 Windows 端编译良好的代码,当我将它移到 Linux 端时,我得到了同样的错误。显然,您在 Linux 端使用的编译器没有看到/使用头文件中的朋友声明,因此会出现此错误。通过简单地在 C++ 文件 BEFORE 中移动朋友函数的定义/实现该函数的用法(例如:可能用于函数回调分配),这解决了我的问题,也应该解决你的问题。
  • 我遇到了同样的问题。请在函数使用之前将朋友函数的定义移到 C++ 文件中,准确解释您的意思。我不明白那是什么意思。请帮帮我。
【解决方案3】:

你实际上并没有声明这个函数。

extern int add(int, int);

【讨论】:

  • 我应该把这个声明放在哪个文件中?
  • 谢谢!知道了!实际上,如果我在 node.cpp 中定义 add 函数,问题就会消失。但我想在一个单独的文件中定义它。为什么一定要在头文件中用extern单独声明?
  • 编译器必须知道函数存在哪些指纹,然后才能生成正确调用它的代码(您可以使用具有不同参数类型的“add”变体:long、float、double、char、等)或默认值。所以在你第一次调用函数之前你需要一个原型声明,并且“朋友”定义不算作原型声明(它会是一个奇怪的上下文来声明一个非成员函数)。跨度>
猜你喜欢
  • 2020-08-23
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多