使用g ++编译主模块的奇怪错误

时间:2012-02-02 00:16:06

标签: c++ g++

我正在尝试使用“g ++ main.cpp -c”编译下面的代码,但它给了我这个奇怪的错误..任何想法?

main.cpp: In function ‘int main()’:
main.cpp:9:17: error: invalid conversion from ‘Graph*’ to ‘int’
main.cpp:9:17: error:   initializing argument 1 of ‘Graph::Graph(int)’
main.cpp:10:16: warning: deprecated conversion from string constant to ‘char*’

这是我试图编译的主要模块,下面是我在graph.hpp中的图形类

#include <iostream>
#include "graph.hpp"

using namespace std;

int main()
{
  Graph g;
  g = new Graph();
  char* path = "graph.csv";
  g.createGraph(path);
  return 0;
}

这是我的Graph类

    /*
 * graph.hpp
 *
 *  Created on: Jan 28, 2012
 *      Author: ajinkya
 */

#ifndef _GRAPH_HPP_
#define _GRAPH_HPP_

#include "street.hpp"
#include "isection.hpp"
#include <vector>

class Graph
{
 public:
  Graph(const int vertexCount = 0);
  //void addIsection(Isection is);
  //void removeIsection(int iSectionId);
  Isection* findIsection(int);
  void addStreet(int iSection1, int iSection2, int weight);
  void createGraph(const char *path); //uses adj matrix stored in a flat file
  //void removeStreet(int streetID);
  void printGraph();
  ~Graph();
 private:
  //Isection *parkingLot;
  //Isection *freeWay;
  int** adjMatrix;
  std::vector <Street*> edgeList;
  std::vector <Isection*> nodeList;
  int vertexCount;
};

    #endif

4 个答案:

答案 0 :(得分:5)

这是C ++,而不是Java或C#。 new在这里的工作方式不同。

new表达式返回指针。您无法将指向Graph(即Graph*)的指针指定给Graph类型的变量:

Graph g;
g = new Graph(); // Graph = Graph* ? nope

似乎编译器试图“有用”并且尝试使用构造函数采用int参数来创建类型为Graph的值,但它无法转换为{{ 1}}到Graph*

当您撰写int时,已经拥有Graph g;个对象。您无需使用Graph创建一个。事实上,你甚至可能想要这样做,因为它会导致to memory leaks

然后是这一行:

new

char* path = "graph.csv"; 的类型为"graph.csv",因此您不应将其分配给char const[10]。在过去,你可以,但结果是一个坏主意。该功能已标记为已弃用,现在已在C ++中完全删除。而不是这样做,你可以:

  • 从中制作一个数组:char*;
  • 使用正确的类型指定它:char path[] = "graph.csv";(这可行,因为array types decay to pointers);

答案 1 :(得分:2)

那应该是g = Graph();并忘记g = new Graph;。原因是new向创建的对象(例如Graph*)返回指针,而不是对象值。

更好的是,只需执行Graph g;并忘记为g分配任何内容。这将通过调用Graph的无参数构造函数自动为您创建Graph

答案 2 :(得分:0)

Graph* g;

它必须是一个指针。

答案 3 :(得分:0)

首先new Graph()返回Graph*。在c ++中,可以隐式调用带有一个参数的构造函数,因此目前您的代码实际上是有意义的:

g = Graph(new Graph());

你想要的是

g = Graph();