考虑以下代码:

#include <iostream>

template<class T>
struct outer {
    struct inner {};
};

template<class T>
std::ostream& operator<<(std::ostream & stream, 
                         typename outer<T>::inner const& value) {
    std::cout << "An outer::inner!";
    return stream;
}

int main() {
    outer<float>::inner foo;

    std::cout << foo << std::endl; // does not compile
}

这不会编译,因为 typename outer<T>::inner 是一个 非核心上下文 (如解释 这里),这意味着编译器无法推导模板-argument-type(阅读 这个答案 为何)。如我所见,我有两个选择使它起作用:

  1. 移动 inner 在外面 outer 并使其成为班级的模板。我更喜欢这个,因为对使用代码的影响较小。
  2. 添加一个 to_string- 内心。

还有其他解决方案(在使用代码中不会导致丑陋的语法)?

有帮助吗?

解决方案

您可以将操作员移至内部阶级主体并放置 friend 之前。然后将参数类型替换为 inner.

另一种技术是从内部参数的CRTP碱基来得出内部。然后使参数类型键入CRTP类并将参数引用到派生 inner 类,其类型由您推论的模板参数给出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top