G++;给出隐晦的错误消息,一些指针问题 我是C++新手,努力使多文件程序工作。我有一个C函数库,我遇到了麻烦,把它转换成C++。我在g++中遇到的最大问题是这个错误消息 error: no match for âoperator=â in â*(((Graph*)this)->Graph::adj + ((long unsigned int)(((long unsigned int)i) * 32ul))) = (operator new(32u), (<statement>, ((List*)<anonymous>)))â error:this中的–operator=–不匹配-->Graph::adj+ ((长无符号整数)((长无符号整数)i)*32ul))=(运算符 新的(32u),(,((列表*))-
这是我的Graph.cpp代码中它抱怨的部分:G++;给出隐晦的错误消息,一些指针问题 我是C++新手,努力使多文件程序工作。我有一个C函数库,我遇到了麻烦,把它转换成C++。我在g++中遇到的最大问题是这个错误消息 error: no match for âoperator=â in â*(((Graph*)this)->Graph::adj + ((long unsigned int)(((long unsigned int)i) * 32ul))) = (operator new(32u), (<statement>, ((List*)<anonymous>)))â error:this中的–operator=–不匹配-->Graph::adj+ ((长无符号整数)((长无符号整数)i)*32ul))=(运算符 新的(32u),(,((列表*))-,c++,arrays,g++,C++,Arrays,G++,这是我的Graph.cpp代码中它抱怨的部分: Graph::Graph(int n){ order = n; size = 0; source = NIL; color = static_cast<char*>(calloc(n + 1, sizeof(char))); distance = static_cast<int*>(calloc(n + 1, sizeof(int))); parent = static_cas
Graph::Graph(int n){
order = n;
size = 0;
source = NIL;
color = static_cast<char*>(calloc(n + 1, sizeof(char)));
distance = static_cast<int*>(calloc(n + 1, sizeof(int)));
parent = static_cast<int*>(calloc(n + 1, sizeof(int)));
adj = static_cast<List*>(calloc(n + 1, sizeof(List*)));
discover = static_cast<int*>(calloc(n + 1, sizeof(int)));
finish = static_cast<int*>(calloc(n + 1, sizeof(int)));
int i;
for(i = 0; i <= n; i++){
color[i] = 'w';
distance[i] = INF;
parent[i] = NIL;
adj[i] = new List();
}
}
Graph::Graph(int n){
顺序=n;
尺寸=0;
来源=零;
颜色=静态(calloc(n+1,sizeof(char));
距离=静态施法(calloc(n+1,sizeof(int));
父项=静态_cast(calloc(n+1,sizeof(int));
adj=静态(calloc(n+1,sizeof(List*));
discover=static_cast(calloc(n+1,sizeof(int));
finish=静态(calloc(n+1,sizeof(int));
int i;
对于(i=0;i您已声明Graph::adj
为List*
类型(adj[i]
与执行*(adj+i)
相同),取消对类型T
的指针的引用将产生类型T
的值,即adj[i]
的类型为List
struct List {
// ...
};
List ** adj = static_cast<List**> (
std::calloc (10, sizeof (List*))
);
/* error
List * adj = static_cast<List*> (
std::calloc (10, sizeof (List*))
);
*/
adj[0] = new List;
如果你真的想做你想做的事情,把Graph::adj
声明为List**
,那么它将是指向List
的一堆指针,而不是指向一堆List
的指针
我不明白,你到底想说什么?
您正试图将列表*
(由新列表
返回)分配给列表
类型的变量
struct List {
// ...
};
List ** adj = static_cast<List**> (
std::calloc (10, sizeof (List*))
);
/* error
List * adj = static_cast<List*> (
std::calloc (10, sizeof (List*))
);
*/
adj[0] = new List;
您已将Graph::adj
声明为类型List*
(adj[i]
与执行*(adj+i)
相同),并且取消对类型T
的指针的引用将产生类型T
的值,即adj[i]
的类型是List
struct List {
// ...
};
List ** adj = static_cast<List**> (
std::calloc (10, sizeof (List*))
);
/* error
List * adj = static_cast<List*> (
std::calloc (10, sizeof (List*))
);
*/
adj[0] = new List;
如果你真的想做你想做的事情,把Graph::adj
声明为List**
,那么它将是指向List
的一堆指针,而不是指向一堆List
的指针
我不明白,你到底想说什么?
您正试图将列表*
(由新列表
返回)分配给列表
类型的变量
struct List {
// ...
};
List ** adj = static_cast<List**> (
std::calloc (10, sizeof (List*))
);
/* error
List * adj = static_cast<List*> (
std::calloc (10, sizeof (List*))
);
*/
adj[0] = new List;
线
建议它是一个指针数组。您应该检查adj的定义。顺便说一下,错误是指后一行
类型
我将详细阐述这个问题的理论方面,它围绕C++类型系统。
C++中的每个表达式都有一个类型,在编译时知道。
static_cast<List*>(...)
也就是说,如果括号中表达式的类型可以静态强制转换为List*,编译器将不会抱怨,表达式的最终类型将是List*。Functioncalloc返回void*,它可以强制转换为任何其他指针;事实上,指针强制转换通常只是告诉编译器yes,I知道我在做什么,闭嘴。在大多数平台上,所有指针类型都有相同的位表示,尽管标准并不强制要求这样做,因此原则上不需要生成机器代码来实现这种转换
表达式的类型,例如
new List()
adj[i]
或
是
包含这些指令的指令为列表对象或10个列表对象分配足够的空间,并返回指向这些空间的指针
如果你换掉这条线,你可能会过得更好
adj = static_cast<List*>(calloc(n + 1, sizeof(List*)));
adj[i] = new List()
如果adj是指针类型,则表达式的类型为
new List()
adj[i]
或
或者干脆
*adj
指针类型减去其中一个星号;也就是说,如果adj的类型为
List *
List
adj[i]的类型是
List *
List
这就是为什么在第adj[i]=new List()行出现错误的原因;赋值没有意义
List *
到
好消息是,如果使用new操作符分配adj,则可能不需要使用new创建每个元素;当使用new分配数组时,它的所有元素都会被创建,编译器会自动调用它们的构造函数
可能的解决方案
由于程序的其余部分完全正确,您只需删除该行即可
adj = static_cast<List*>(calloc(n + 1, sizeof(List*)));
adj[i] = new List()
但是正如约翰所说,你的意图不是很清楚,你真的需要告诉我们你是否想成为一系列的对象
List *adj;
或者一个指针数组
List **adj;
高级主题
使用C方式与
adj = static_cast<List*>(calloc(n + 1, sizeof(List*)));
< P>是每个分配的<强>列表强> >不使用前一个方法调用.Doad有几个应用程序,在这里您可能希望是这样的,但一般不应该混合C和C++。 行< /P>
建议它是一个指针数组。您应该检查adj的定义。顺便说一下,错误是指后一行
类型
我将详细阐述这个问题的理论方面,它围绕C++类型系统。
C++中的每个表达式都有一个类型,在编译时知道。
static_cast<List*>(...)
也就是说,如果括号中表达式的类型可以静态强制转换为List*,编译器将不会抱怨,表达式的最终类型将是List*。Functioncalloc返回void*,它可以强制转换为任何其他指针;事实上,指针强制转换通常只是告诉编译器的一种方式
class Graph
{
...
List* adj;
...
};
adj[i] = new List();
#include <new>
new (adj + i) List();
adj = static_cast<List*>(calloc(n + 1, sizeof(List*)));
adj = static_cast<List*>(calloc(n + 1, sizeof(List)));