Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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++ - Fatal编程技术网

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),(,((列表*))-

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.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_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)));