C ++:无法使operator <<为模板嵌套类的朋友

时间:2019-08-15 04:00:01

标签: c++ templates inner-classes friend

这是基本的代码结构(如果与问题相关,我将进一步介绍):

class Outer {
    // Forward declaration for the next forward declaration
    template <class C> class Inner;

    // Forward declaration for the actual Inner class definition
    template <class C>
    friend std::ostream& operator<<(std::ostream &os, const Inner<C> &obj);

    template <class C>
    class Inner {
        friend std::ostream& operator<< <>(std::ostream &os, const Inner &obj);
    };
};

由于内部类是模板化的,所以我意识到我的operator<<覆盖也必须如此。另外,第二个friend声明是模板实例化,因此operator<< <C>仅是与Outer::Inner<C>的朋友。

当我在单独的实现文件中定义运算符替代时,它看起来像这样:

template <class C>
std::ostream& operator<<(std::ostream &os, const Outer::Inner<C> &obj) {
    // definition
}

在过去的几天中,我反复地将代码重构到一个荒谬的程度,以期实现这项工作。最近,我只尝试在g ++上编译*.h并收到同一行的所有三条错误消息(一个带有模板实例化的消息)。

outer.h:x:y1: error: declaration of ‘operator<<’ as non-function
    friend std::ostream& operator<< <>(std::ostream &os, const Inner &obj);
                                 ^~
outer.h:x:y1: error: expected ‘;’ at end of member declaration
outer.h:x:y2: error: expected unqualified-id before ‘<’ token
    friend std::ostream& operator<< <>(std::ostream &os, const Inner &obj);
                                    ^

尽管广泛地搜索错误输出中给出的短语,但是,我仍然无法解决这个问题,因此,如果我有C ++经验的人(与我不同)知道他们在做什么,我将不胜感激。帮助。

1 个答案:

答案 0 :(得分:0)

经过更多研究,我相信这种特定情况实际上是不可能的-operator重载通常不能成为嵌套和模板化类的朋友。 (如果您认为这是错误的,请告诉我原因,因为我自己还不是C ++专家。)

我为此尝试了许多不同的解决方案,尽管我认为对我尝试过的每种方法以及其失败的具体原因进行详细的描述并不是很有效,但是其中包括一些错误。

  • 无效使用不完整类型class Outer
  • 字段...类型不完整的Outer::Inner< [类型] >
  • 没有与operator<<匹配的
  • operator<<的模棱两可的超载

除了原始帖子中的内容。

因此,在我的代码这一部分,我放弃了operator<<方法。我不太优雅但立即有效的替代方法:

class Outer {
    template <class C>
    class Inner {
    public:
        std::ostream& printout(std::ostream &os) {
            os << /* whatever */ << /* I want */ << /* to print */;
            return os;
        }
    };
};

一些可能有用的链接: