C++ 在我的自定义对象数组中不匹配 'operator='
C++ no match for 'operator=' in my custom object array
我有一个名为 KernelLock 的 class,我正在创建一个名为 myLockArray 的 KernelLock 数组。我这样声明:KernelLock myLockArray[150];
当我尝试向 myLockArray 添加新的 KernelLock 时,出现上述错误。这是我收到错误的确切行:
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这里是确切的错误:
error: no match for 'operator=' in 'myLockArray[initializedLocksCounter] = (((KernelLock*)operator new(8u)), (<anonymous>->KernelLock::KernelLock(myAddrSpace, newLock), <anonymous>))
如果有帮助,我正在通过 Nachos 使用 gcc 进行编译。
您不能使用 KernelLock*
类型的值作为 KernelLock
数组的元素。你只需要做:
myLockArray[i] = KernelLock(myAddrSpace, newLock);
其中 i
是有效索引。
但是,请注意,这样做无论如何都会付出默认初始化 150
KernelLock
的代价(而且这可能代价高昂)。使用标准库会更好:
std::vector<KernelLock> kernel_locks;
kernel_locks.reserve(some_size); // better to reserve if you have some sensible upper bound
kernel_locks.emplace_back(myAddrSpace, newLock);
KernelLock myLockArray[150];
创建一个 150 KernelLock
的数组。然后您尝试为其分配一个 KernelLock *
。如果你想要指针,那么你需要将你的数组更改为:
KernelLock* myLockArray[150];
如果您不想要指针,那么您只需要将您的分配更改为
myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
KernelLock myLockArray[150];
这是一个包含 150 个内核锁的数组。
When I try to add a new KernelLock to myLockArray
您不能向数组中添加任何对象。数组的大小始终是常数。它总是有 150 个锁。
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这是错误的。 new
returns 动态分配对象的地址。您正在尝试将该地址分配给索引 initializedLocksCounter
处的现有 KernelLock
对象。您不能将地址分配给非指针对象(除非该对象具有相应的(非显式)构造函数)。
如果你想要一个不断增长的数组,使用std::vector<KernelLock>
您基本上误解了 C++ 中的对象是什么。这不像 Java.
您的 150 个 KernelLock
个对象是 150 个 KernelLock
个对象。不是指针,也不是引用。其中有 150 个。您不能随时动态 "expand" 数组,使用 new
这样做是动态分配,需要管理指针 (KernelLock*
)。
听起来,你其实想要一个std::vector<KernelLock>
。
Here are some resources for learning the basics of C++.
我有一个名为 KernelLock 的 class,我正在创建一个名为 myLockArray 的 KernelLock 数组。我这样声明:KernelLock myLockArray[150];
当我尝试向 myLockArray 添加新的 KernelLock 时,出现上述错误。这是我收到错误的确切行:
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这里是确切的错误:
error: no match for 'operator=' in 'myLockArray[initializedLocksCounter] = (((KernelLock*)operator new(8u)), (<anonymous>->KernelLock::KernelLock(myAddrSpace, newLock), <anonymous>))
如果有帮助,我正在通过 Nachos 使用 gcc 进行编译。
您不能使用 KernelLock*
类型的值作为 KernelLock
数组的元素。你只需要做:
myLockArray[i] = KernelLock(myAddrSpace, newLock);
其中 i
是有效索引。
但是,请注意,这样做无论如何都会付出默认初始化 150
KernelLock
的代价(而且这可能代价高昂)。使用标准库会更好:
std::vector<KernelLock> kernel_locks;
kernel_locks.reserve(some_size); // better to reserve if you have some sensible upper bound
kernel_locks.emplace_back(myAddrSpace, newLock);
KernelLock myLockArray[150];
创建一个 150 KernelLock
的数组。然后您尝试为其分配一个 KernelLock *
。如果你想要指针,那么你需要将你的数组更改为:
KernelLock* myLockArray[150];
如果您不想要指针,那么您只需要将您的分配更改为
myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
KernelLock myLockArray[150];
这是一个包含 150 个内核锁的数组。
When I try to add a new KernelLock to myLockArray
您不能向数组中添加任何对象。数组的大小始终是常数。它总是有 150 个锁。
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这是错误的。 new
returns 动态分配对象的地址。您正在尝试将该地址分配给索引 initializedLocksCounter
处的现有 KernelLock
对象。您不能将地址分配给非指针对象(除非该对象具有相应的(非显式)构造函数)。
如果你想要一个不断增长的数组,使用std::vector<KernelLock>
您基本上误解了 C++ 中的对象是什么。这不像 Java.
您的 150 个 KernelLock
个对象是 150 个 KernelLock
个对象。不是指针,也不是引用。其中有 150 个。您不能随时动态 "expand" 数组,使用 new
这样做是动态分配,需要管理指针 (KernelLock*
)。
听起来,你其实想要一个std::vector<KernelLock>
。
Here are some resources for learning the basics of C++.