【问题标题】:How to use a friend function in cpp file?如何在cpp文件中使用朋友功能?
【发布时间】:2017-11-28 18:56:51
【问题描述】:

我有一个头文件和一个 cpp 文件...在 .h 文件中,我声明了一个 ZZZ 类并添加了一些私有参数并声明了一个 friend 函数,但是当我尝试访问.cpp 文件出现错误:

error: within this context
     output << zzz.ZZZ_name << "." ;

而且我在 heder 文件中也得到了这个带有私有参数的错误:

error: 'std::string X::Y::ZZZ::ZZZ_name' is private
     string ZZZ_name;

ZZZ.h

#include <iostream>
#include <string>
using std::string;

namespace X {
namespace Y {

class ZZZ {
private:
    string ZZZ_name;

public:
    friend std::ostream &operator<<(std::ostream &output, const ZZZ &zzz);
};

std::ostream &operator<<(std::ostream &output, const ZZZ &zzz);

}}

ZZZ.cpp

#include "ZZZ.h"
#include <stdbool.h>

using namespace X::Y;
using std::cout;

std::ostream& operator<<(std::ostream& output, const ZZZ& zzz){
    output << zzz.ZZZ_name << "." ;
    return output;
}

【问题讨论】:

  • 标头引用命名空间XY.cpp 文件莫名其妙地引用了名为 xy 的完全不同的命名空间。这显然不是真正的代码,而是幻想代码(更不用说头文件中明显的语法错误,函数声明中缺少右括号)。如果您想获得有关真实代码问题的有用答案,您需要以minimal reproducible example 的形式展示真实代码,而不是用虚假代码浪费大家的时间。失败。
  • 我不会浪费你的时间吗,因为我没有问你 :) 我的代码也很大,我想问一下这个具体的事情......我知道如果没有人会帮助我我插入了一个 1000+ 代码.. 这个想法很清楚:如何声明一个朋友函数一个 cpp
  • @kasandra 你编译了这个示例代码吗? Godbolt 在抱怨操作符之前指出了缺少的括号和不正确的命名空间。
  • 我想确保我明白你在说什么。正如这篇帮助中心文章所解释的那样,而不是提供带有真实代码的minimal reproducible example;您希望有人阅读与任何事情无关的虚构代码,除了真正的问题之外还有明显的拼写错误,无论它是什么,并为您解决?这里还有很多其他问题,提问者花时间将他们的大代码修剪到演示问题所需的最低限度,并且有人给出了答案。如果你不关心提出一个好的问题,那么就不太可能得到一个好的答案。
  • @kasandra “有人已经帮助了我” 这并没有让你的问题变得更好。

标签: c++ namespaces friend


【解决方案1】:

因为你在命名空间XY 中声明了你的友元函数,所以你必须告诉编译器你在源文件中的定义属于已经声明的原型:

std::ostream& operator<<(std::ostream& output, const ZZZ& zzz);

因此,要解决您的定义不是没有前向声明的新函数的歧义,您必须在源文件中使用命名空间作为前缀:

std::ostream& X::Y::operator<<(std::ostream& output, const ZZZ& zzz) {
    output << zzz.ZZZ_name << "." ;
    return output;
}

或者,作为另一种选择,您也可以执行以下操作:

namespace X { namespace Y {
    std::ostream& operator<<(std::ostream& output, const ZZZ& zzz) {
        output << zzz.ZZZ_name << "." ;
        return output;
    }
}}

【讨论】:

  • 我不能在我的情况下!教授要求不要:\
  • 这不是我:\我实际上接受了你的回答
猜你喜欢
  • 2011-09-24
  • 2015-09-29
  • 1970-01-01
  • 2011-04-17
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多