无法将 '(<expression error>)' 从 '<brace-enclosed initializer list>' 转换为 std::unique_ptr<
Posted
技术标签:
【中文标题】无法将 \'(<expression error>)\' 从 \'<brace-enclosed initializer list>\' 转换为 std::unique_ptr<int []>【英文标题】:could not convert '(<expression error>)' from '<brace-enclosed initializer list>' to std::unique_ptr<int []>无法将 '(<expression error>)' 从 '<brace-enclosed initializer list>' 转换为 std::unique_ptr<int []> 【发布时间】:2016-09-23 02:24:28 【问题描述】:我有最新的 gcc 编译器。 gcc (Ubuntu 6.2.0-3ubuntu11~14.04) 6.2.0
在 code::blocks 上,我将编译器默认设置为 GNU Compiler。
我得到的错误是这样的
错误:无法将
<expression error>
从<brace-enclosed initializer list>
转换为std::unique_ptr<int []>
问题出在我底部的头文件中。
这是我在课堂上做的一个实验室,我认为它上周运行良好 - 编译头文件给了我结果,但是当我从 arrayclass.cpp 文件构建时,它给了我这个错误。
这是我的实现文件 ArrayClass.cpp:
#include "ArrayClass.h"
#include <memory>
using std::make_unique;
ArrayClass::ArrayClass(int capacity)
: arrSizecapacity,
arrmake_unique<int[]>(capacity)
void ArrayClass::insert(int value)
if (currentSize < arrSize)
arr[currentSize++] = value;
void ArrayClass::set(int i, int value)
if (i >= 0 && i < currentSize)
arr[i] = value;
int ArrayClass::get(int i) const
if (i >= 0 && i < currentSize)
return arr[i];
else
return 0;
int ArrayClass::capacity() const
return arrSize;
int ArrayClass::size() const
return currentSize;
这是我的头文件:
#ifndef ArrayClass_header
#define ArrayClass_header
#include <memory>
using std::unique_ptr;
using std::make_unique;
class ArrayClass
public:
// Constructors and Destructors
// Default constructor
// POST: Created an ArrayClass object with an array of size def_size
// Compiler default suffices (see variable initializations at end of header)
ArrayClass() = default;
// Constructor
// PRE: capacity > 0
// POST: Created an ArrayClass object with an array of size capacity
// PARAM: capacity = size of the array to allocate
ArrayClass(int capacity);
// Destructor
// POST: All dynamic memory associated with object de-allocated
// ~ArrayClass();
// Set the value of the next free element
// PRE: currentSize < arraySize
// POST: Element at index currentSize set to value
// PARAM: value = value to be set
void insert(int value);
// Return an element's value
// PRE: 0 <= i < arraySize
// POST: Returned the value at index i
// PARAM: i = index of value to be returned
int get(int i) const;
// Set an element's value
// PRE: 0 <= i < arraySize
// POST: Element at index i set to value
// PARAM: i = index of element to be changed
// value = value to be set
void set(int i, int value);
// POST: Return the currently allocated space
int capacity() const;
// POST: Return the number of elements
int size() const;
// The default capacity
static constexpr int def_capacity 10;
private:
int arrSize def_capacity;
int currentSize 0;
unique_ptr<int[]> arr make_unique<int[]>(capacity);
;
#endif
【问题讨论】:
最好不要将using
声明放在标题中,以防有人想使用您的标题但没有using
s
已投票关闭为错字,因为问题只是缺少def_
。
我也会注意到这一点,干杯
【参考方案1】:
我很确定错误就在这里:
unique_ptr<int[]> arr make_unique<int[]>(capacity);
capacity
应该改为 def_capacity
,因为到目前为止,您使用的是函数名称但没有圆括号,这会使编译器在解析 初始化列表时出错。
编辑:是的,修复后它编译得很好。有两个错误,第一个是“无效使用非静态成员函数int ArrayClass::capacity() const
”。然后是初始化列表,因为编译器无法解析初始化列表。
编辑 2:在 .cpp
文件中,在构造函数定义中,capacity
似乎隐藏了 ArrayClass::capacity()
函数,但我仍然认为最好避免这样的碰撞只是为了清楚起见。
【讨论】:
是的,它是在你修复之后编译的——所以如果我理解正确,int 数组的分配需要一个 int 值,我给它一个变量,所以编译器生我的气并告诉我我做不到。 另外int ArrayClass::capacity() const
修复后似乎不是错误,所以一石二鸟? (也谢谢你!)
你做了什么来提供一个 function name 甚至不是一个调用,因为它没有括号。这本身就是编译器错误,在这种情况下使用这样的函数名称。至于 const vs 变量,我对 C++14 知之甚少,但我认为您需要将 ArrayClass::capacily()
声明为 constexpr
才能在此处使用它。
哦,是的,容量()是我定义的函数之一。
确切地说,如果您将其地址保存在函数指针中,那么没有括号的函数名就可以了。第一个错误正是针对缺少的括号。以上是关于无法将 '(<expression error>)' 从 '<brace-enclosed initializer list>' 转换为 std::unique_ptr<的主要内容,如果未能解决你的问题,请参考以下文章
无法将 '(<expression error>)' 从 '<brace-enclosed initializer list>' 转换为 std::unique_ptr<
VMware Workstation 打开虚拟机提示:传输(VMDB)错误-14: Pipe connection has been broken 无法待机/Transport (VMDB) erro