极光之森 2024-10-11 22:52 采纳率: 100%
浏览 12
已结题

C++ typeid 传入重写<<的泛型模板类后报错

使用C++ typeid关键字时,传入非泛型模板类通过编译,传入不含<<重载运算符的模板类通过编译,只有传入含有<<重载的模板类有问题,显示:

img

//main.cpp
auto a = typeid(MSTL::array<int, 3>).name();    // 删除后即可通过编译

//array.h
template <typename Tp, size_t Np>
friend std::ostream& operator <<(std::ostream& _out, const MSTL::array<Tp, Np>& _arr) {    // 删除后也可通过编译
    _arr._show_data_only(_out);
    return _out;
}
inline void _show_data_only(std::ostream& _out) const {    // 附_show_data_only实现,本人复现多次认为报错与他无关
    auto _band = this->_size - 1;
    _out << '[' << std::flush;
    for (size_t i = 0; i < this->_size; i++) {
        _out << this->_data[i] << std::flush;
        if (i != _band) _out << ", " << std::flush;
    }
    _out << ']' << std::flush;
}

本人不知<<已被定义问题从何而来,求帮助!

  • 写回答

2条回答 默认 最新

  • 真相重于对错 2024-10-12 09:23
    关注

    没有全部代码,我猜测,你定义的operator<<是个模板函数,
    而你的array类是模板类,这样的话,可能会有问题,因为operator是一个函数模板而不是具体的函数,对于具体的array(已经通过模板参数具象化的)array,他不知道该用什么模板参数确定operator<<

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日
  • 创建了问题 10月11日