(c++14) operator<< 重载不能按智能指针向量的预期工作

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

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

我正在尝试使用 C++14 功能。在这个程序中,我试图使用智能指针并重载 << 运算符。

一个 tacoCalendar 对象包含一个用于 tacoTuesdays 对象的向量智能指针,其中一个是在 tacoCalendar 的初始化时创建的。 cout << month.my_tacoTuesdays.at(0).get(); 行应该将 monthtacoTuesdays 向量的第一个智能指针的指针发送给友元函数 friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);,从而返回 "tacos!" 并且发送到 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() returns a T*,但是您的 operator<< 重载(正确地)采用了引用而不是指针。

改变

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

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

或者如果任何 shared_ptr 实例可以为空,

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