无法将 '(<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。

我得到的错误是这样的

错误:无法将 &lt;expression error&gt;&lt;brace-enclosed initializer list&gt; 转换为 std::unique_ptr&lt;int []&gt;

问题出在我底部的头文件中。

这是我在课堂上做的一个实验室,我认为它上周运行良好 - 编译头文件给了我结果,但是当我从 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 声明放在标题中,以防有人想使用您的标题但没有usings 已投票关闭为错字,因为问题只是缺少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<

无法将express.js中的数据发送到模板中的html

Type erroe in tensorflow

如何在数学表达式中添加星号?

VMware Workstation 打开虚拟机提示:传输(VMDB)错误-14: Pipe connection has been broken 无法待机/Transport (VMDB) erro

关于 国产麒麟系统上长时间运行Qt程序.xsession-erros文件占满磁盘导致无法写入 的解决方法