在类中声明与父类具有相同类型的模板类

declare template class within class with same types as parent class

本文关键字:同类型 声明 父类      更新时间:2023-10-16

类范围内的类的花哨的cout/shift operator<<

template <typename X, typename Y> class Foo {
public:
    template <typename A, typename B> class Bar {
        A a;
        B b;
    };
    Bar<X,Y> baba;
};
template <typename V, typename W>
std::ostream &operator<< (std::ostream& os, Foo<V,W>::template Bar<V,W> *b) {return os;}

这不会编译。但是如何正确地做到这一点呢?


错误:

error: expected template-id for type before ‘*’ token
  std::ostream &operator<<(std::ostream &os, Foo<V, W>::template Bar<V, W> *b)

它应该是:

template <typename V, typename W>
std::ostream &operator<< (std::ostream& os, typename Foo<V,W>::template Bar<V,W> &b) {return os;}

但是更改类可能更简单:

template <typename X, typename Y> class Foo {
public:
    class Bar {
        X a;
        Y b;
    };
    Bar baba;
};
template <typename V, typename W>
std::ostream &operator<< (std::ostream& os, const typename Foo<V,W>::Bar& b) {return os;}

真正的解决方案(为了避免类型推导问题)是将 free 函数放在类中:

template <typename X, typename Y> class Foo {
public:
    class Bar {
        X a;
        Y b;
        friend
        std::ostream &operator<< (std::ostream& os, const Bar &b) {return os;}
    };
    Bar baba;
};