(C 14)操作员<<超负荷无法正如智能指针向量所预期的那样工作

(c++14) operator<< overloading not working as expected from vector of smart pointers

本文关键字:lt 向量 指针 工作 智能 操作员 超负荷      更新时间:2023-10-16

我在这里做错了什么,但是我不确定。我希望该程序的输出是"炸玉米饼!",但我会得到一个内存位置。

我正在尝试使用C 14个功能。在此程序中,我试图使用智能指针并超载&lt;&lt;操作员。

一个tacocalendar对象具有用于tacotuesdays对象的矢量智能指针,其中一个是在tacocalendar的初始化上创建的。cout << month.my_tacoTuesdays.at(0).get();行应获得monthtacoTuesdays向量的第一个智能指针的指尖,向朋友函数friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);发送"炸玉米饼!"。被返回并发送到std::cout

代码:

#include <iostream>
#include <vector>
#include <string>
#include <memory>
class tacoTuesdays {
public:
    tacoTuesdays(int i) {
        _i = i;
    }
    friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);
private:
    int _i;
};
std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt) {
    std::string str_out = "tacos!";
    os << str_out;
    return os;
}
typedef std::shared_ptr< tacoTuesdays > smart_tacoTuesdays_t;
class tacoCalendar {
public:
    std::vector<smart_tacoTuesdays_t> my_tacoTuesdays;
    tacoCalendar(int i) {
        smart_tacoTuesdays_t tt(new tacoTuesdays(i));
        my_tacoTuesdays.push_back(tt);
    }
    ~tacoCalendar() {
    }
private:
};
int main(int argc, char **argv) {
    using namespace std;
    tacoCalendar month(2);
    cout << *month.my_tacoTuesdays.at(0).get();
    return 0;
}

std::shared_ptr<T>::get()返回T*,但是您的operator<< Overload(正确)采用参考而不是指针。

更改

cout << month.my_tacoTuesdays.at(0).get();

to

cout << *month.my_tacoTuesdays.at(0);

或任何shared_ptr实例可以为null,

if (auto* p = month.my_tacoTuesdays.at(0).get()) {
    cout << *p;
}

请注意cout的类型:

cout << month.my_tacoTuesdays.at(0).get();

它正在打印std::vector<std::shared_ptr<tacoTuesdays>>::at(0).get(0),即指针tacoTuesdays*,因此cout为您打印原始指针地址。

要获得想要的东西,您应该通过tacoTuesdaysconst reference,这样:

cout << *month.my_tacoTuesdays.at(0);