C ++定义内部类的<<操作符

Unamourdeswann

在我没有启动的项目上工作,我想在类中添加一个<<运算符。问题:该类是另一类的私有内部类,后者在内namespace

而且我做不到。

可以通过以下方式简化问题:

#include <iostream>
#include <map>
namespace A {
    class B {
        private:
            typedef std::map<int, int> C;
            C a;
            friend std::ostream& operator<<(std::ostream& os, const C &c) {
                for (C::const_iterator p = c.begin(); p != c.end(); ++p)
                    os << (p->first) << "->" << (p->second) << " ";
                return os;
            }
        public:
            B() {
                a[13] = 10;
                std::cout << a << std::endl;
            }
        };
}
int main() {
    A::B c;
}

我试图用编译g++ test.cpperror: no match for ‘operator<<’编译器找不到我的重载函数。我认为在标头中定义它会更简单,没有运气。如果您认为它更合适,我也可以在CPP文件中定义该类,但是我不知道该怎么做。

最后一个要求,我不能使用C ++ 11(不幸的是)。

迈克·西摩

由于Friend运算符首先在类内部声明,因此只能通过依赖于参数的查找来使用。但是,它的参数类型都不在中namespace A,因此将找不到它。C是的别名std::map,因此被认为是namespace stdADL的目的。

您可以通过多种方法来解决它,但没有一种是完美的:

  • namespace A在类定义之前声明函数那么它就可以通过常规查询使用,而不仅仅是ADL。但是,这在某种程度上破坏了封装,如果其他任何尝试使过载operator<<则可能会导致问题std::map
  • 用命名的静态(而非朋友)函数替换运算符重载,然后按名称进行调用。
  • 声明C为内部类,而不是的别名std::map这样可以在不破坏封装的情况下启用ADL,但是如果您希望它的行为像一样,则有点尴尬std::map

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带操作符说明的C宏

<<操作符模板的实现// C ++

C ++模板返回操作符的类型[]

VC++宏定义##操作符

如何修复“操作符不匹配[]”错误(C ++)

检查操作符是否在C ++中超载

C ++成员访问/间接操作符对等

C ++获取没有操作符的变量地址

容器调用操作符上的c ++ std :: forward []

澄清C ++中<<操作符重载的行为

C ++模板内部类Friend运算符重载

是否可以在Raku中定义自定义元操作符?

如何在自定义对象的<<操作符中添加自定义前缀

在模板化类中重载<<操作符会给我链接器错误(C ++)

数据类型text和varchar在C#中等于操作符不兼容

C99 VLA大小确定和操作符大小

当打印std :: vector <std :: pair>时,C ++“操作符<<”不匹配

在C ++中使用友函数进行I / O操作符重载

编译qt项目给操作符delete提供了未定义的引用(void *,unsigned int)

g++ 用户定义的动态链接库上的全局新建和删除操作符

在两次递增和间接操作符的情况下,C如何处理操作优先级?

编写一个简单的C ++线程安全日志库,如何使线程安全<<操作符?

C ++在操作符重载函数内创建,分配新变量并将其与两个对象进行比较

使用从操作符new返回的指针作为数组元素的指针时,它是否是未定义的行为

为什么我的自定义操作符没有导入到我的DAG(气流)中?

编译代码时出错 | 操作符在模板定义下重载,使用 VS2017 Update8.2

为什么 FormArrayName 在我的 html 中总是未定义,即使使用安全导航操作符?

C ++内部类的替代方法

C ++模板和内部类