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

base operand has non pointer type g++ compiler error

本文关键字:类型 G++ 编译器 错误 指针 操作数      更新时间:2023-10-16

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

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

不要取消引用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));
}

注: 如果不希望关联是多对多的,则可以剥离 addNeighbord 部分。

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

可以在

代码中找到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()函数

现在应该编译了