我正在尝试使用“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
答案 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();