我在这里做错了,但是我不确定。我希望程序的输出为“ tacos!”,但是我却获得了一个内存位置。

我正在尝试使用C ++ 14功能。在此程序中,我尝试使用智能指针并使<
一个tacoCalendar对象持有一个tacoTuesdays对象的矢量智能指针,其中的一个是在tacoCalendar的初始化上创建的。 cout << month.my_tacoTuesdays.at(0).get();行应将tacoTuesdaysmonth向量的第一个智能指针的指针发送给好友函数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<<重载(正确)采用了引用而不是指针。

更改

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




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


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

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

关于c++ - (c++ 14)operator <<重载无法按智能指针 vector 的预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38045343/

10-12 20:40