基本操作数具有非指针类型g ++编译器错误

时间:2013-09-26 07:35:08

标签: c++ c++11

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

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

2 个答案:

答案 0 :(得分: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)将返回std::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集合来存储(和免费)创建的邻居。

答案 1 :(得分:0)

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

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

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

您必须在MyCity类

中实现get_name()函数

现在应该编译