我确定这是重复的,但我所见过的所有内容都解释了如何为数组动态分配内存。我有一个固定长度的数组,我只想把它放在一个包装器结构中,以方便参考。这是简单的代码:
HEADER FILE
positions.insert(RefEquality(&left_rook), (0, 0));
positions.insert(RefEquality(&right_rook), (0, 7));
CPP文件
#ifndef BOARD_T_H
#define BOARD_T_H
#include <iostream>
struct board_t {
board_t();
/* I've tried explicitly assigning length b[16] and just declaring
* b[]. Neither seem to work.
------------------------v */
board_t(unsigned int b[16]);
board_t(board_t& other);
unsigned int values[16];
};
#endif
测试文件
#include "board_t.hpp"
board_t::board_t(){
for (int i = 0; i < 16; ++i) values[i] = 0;
}
board_t::board_t(unsigned int b[16]) {
for (int i = 0; i < 16; ++i) {
values[i] = b[i];
}
}
board_t::board_t(board_t& other) {
for (int i = 0; i < 16; ++i) this->values[i] = other.values[i];
}
编制错误
#include "board_t.hpp"
int main(){
unsigned int arr[16];
for (int i = 0; i < 16; ++i ) arr[i] = i;
board_t b = board_t(arr);
}
我知道有一些方法(比如使用std :: array或boost等),但这真的让我烦恼 - 我只需要知道如何让它工作!
如果这非常明显,请再次抱歉。我尽量不重复污染SE,但有时候我无法帮助自己;)
答案 0 :(得分:3)
你应该做的
board_t b(arr);
不
board_t b = board_t(arr);
原因如下。当你写
board_t b = board_t(arr);
编译器创建一个临时实例,然后尝试使用copy-construtor初始化 b ,将临时值作为参数。但是,您的临时值是r值。您的copy-constructor声明为
board_t(board_t& board);
即,引用对board_t类型的变量的引用。但是,r值不能作为参考参数传递。但是,R值可以传递给 const 引用。意思是,如果你写
board_t(const board_t& board);
然后你的代码就可以了。
备注:尽管理论上会在您的代码中创建一个临时代码,但大多数编译器会优化临时代码并在现场创建 b ,而不会创建临时代码。如果你有兴趣,请查找copy-elision。
答案 1 :(得分:0)