-1

在以下代码中,我收到错误:

city.cc: In member function ‘std::vector<std::basic_string<char> > MyCity::get_neighbours()’:
city.cc:25:42: error: base operand of ‘->’ has non-pointer type ‘std::pair<MyCity*, double>’
In file included from /depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:65:0,
                 from /depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/char_traits.h:41,
                 from /depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ios:41,
                 from /depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ostream:40,
                 from /depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/iostream:40,
                 from city.cc:1:
/depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_pair.h: In instantiation of ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = std::basic_string<char>; _U2 = double; _T1 = MyCity*; _T2 = double]’:
city.cc:18:50:   required from here
/depotbld/RHEL5.5/gcc-4.7.2/bin/../lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_pair.h:111:39: error: cannot convert ‘const std::basic_string<char>’ to ‘MyCity*’ in initialization

.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class MyCity {
string name;
std::vector<pair<MyCity*,double> > neighbours;
public:
MyCity()
{
   // neighbours.clear();
}
MyCity(string s, string s1, double d)
{
    name = s;
    neighbours.push_back(std::make_pair(s1,d));
}
std::vector<string> get_neighbours( )
{
    std::vector<string> names;
        for (size_t i = 0; i< neighbours.size(); ++i)
        {
        names.push_back(neighbours[i]->first->get_name());
    }
    return names;
}
};

class MyState {
vector<MyCity*> cities;
string name;
public:
MyState() { }
MyState(string s) {
    name =s;
}
bool add_city(string name, string neigh, double d)
{
    MyCity* c = new MyCity(name,neigh,d);
    cities.push_back(c);
    return true;
}
};
4

2 回答 2

1

不要取消引用,std::pair因为它不是指针。

std::vector<string> get_neighbours( )
{
    std::vector<string> names;

    for (size_t i = 0; i< neighbours.size(); ++i)
        names.push_back(neighbours[i].first->get_name());

    return names;
}

您的构造函数中也有问题,std::make_pair(s1, d)将返回 astd::pair<std::string, double>所以它不能被推回你的邻居向量。

尝试这样的事情:

MyCtiy(string s)
    :name(s)
{
}

MyCity(string s, string s1, double d)
    :name(s)
{
    created_neighbours.emplace_back(new neighbour(s1));
    MyCity* city = created_neighbours.back().get();
    neighbours.push_back(std::make_pair(city, d));
    city->addNeighbour(this, d);
}

private:
std::vector<std::unique_ptr<MyCity>> created_neighbours;

void addNeighbour(MyCity* city, double d)
{
    neighbours.push_back(std::make_pair(city, d));
}

注意:如果您不希望关联是多对多的,则可以去掉 addNeighbourd 部分。

编辑:修复 addNeighbour 以提供 MyCity 指针。创建了一个 created_neighbours 集合来存储(和免费)创建的邻居。

于 2013-09-26T07:52:39.023 回答
0

在您的代码中可以找到 3 个错误。请在您的代码中找到并更正以下 2 行

neighbours.push_back(std::make_pair(some_pointer_to_the_MyCity_object,d));

names.push_back(neighbours[i].first->get_name());

你必须在 MyCity 类中实现 get_name() 函数

现在应该编译

于 2013-09-26T08:35:13.170 回答