C++:无法使 operator<< 成为模板化嵌套 class 的友元

C++: Cannot make operator<< a friend of a templated nested class

这是基本的代码结构(如果它与问题相关,我会透露更多):

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);
    };
};

由于内部 class 是模板化的,我意识到我的 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++ 经验的人(与我不同的人)知道他们在做什么,我将不胜感激,可以帮忙吗。

经过更多的研究,我确信这个具体情况实际上 不可能 operator 重载通常不能成为 [=49 的朋友=] 是嵌套和模板化的。 (如果您认为这是错误的,请告诉我原因,因为我自己远不是 C++ 专家。)

我已经尝试过很多很多不同的解决方案,虽然我认为详细说明我尝试过的每一种方法以及它们失败的具体原因不会很有成效,但其中一些包含错误

  • 不完整类型的无效使用class Outer
  • 字段... 类型不完整 Outer::Inner<[类型]>
  • 没有匹配 operator<<
  • operator<<
  • 的不明确重载

除了原来的post。

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

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

一些可能有用的链接: