【问题标题】:'initializing': cannot convert from 'Array<int,3>' to 'int'“正在初始化”:无法从“Array<int,3>”转换为“int”
【发布时间】:2016-03-03 05:20:05
【问题描述】:

考虑以下代码:

#include <cstddef> //for std::size_t

template<class T, std::size_t Size>
class Array
{
private:
    T _data[Size];
public:
    template<class... Args>
    Array(Args&&... vals)
        : _data{ vals... }
    {}
};

int main()
{
    Array<int, 3> a = { 1, 2, 3 };
    Array<int, 3> b = { 4, 5, 6 };

    Array<Array<int, 3>, 2> arr = { a, b };
}

类的前两个对象(ab)一切正常。

然后我声明一个数组数组(如果你愿意,可以是二维数组)。所以当Array&lt;Array&lt;int, 3&gt;, 2&gt; arr;的构造函数被执行时,我相信模板参数T将等于Array&lt;int, 3&gt;。这样我们应该能够成功地给Args&amp;&amp;... 其他相同类型的对象。然后参数包会展开。

所以Array&lt;Array&lt;int, 3&gt;, 2&gt; arr; 本质上应该有一个私有成员:

Array<int, 3> _data[2];

显然不是,因为我得到了标题中的错误。

【问题讨论】:

  • 在发布之前测试您的代码。
  • @Karoly Horvath 我测试了我的代码,但对它没有按我预期的那样工作感到困惑。这就是我发布问题的原因。我在实际问题中尽可能地解释了我的困惑。
  • 不,测试你实际发布的代码。
  • @Karoly Horvath 好的,这是一个错字。我的错。
  • @VillasV class = std::enable_if_t&lt;sizeof...(Args) &lt;= Size&gt; 从示例中省略。做这项工作。

标签: c++ arrays templates c++11 variadic-templates


【解决方案1】:

我无法理解那个编译错误消息,但显然提供了一个复制构造函数可以解决问题。

我认为因为您没有提供复制构造函数,它会尝试使用 vals... 直接初始化类成员,然后尝试在 int[] 内分配一个 Array

不提供复制构造函数并尝试通过复制进行任何构造会导致相同的错误消息:

Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> c = a;

main.cpp:17:26: 错误:在初始化时无法将 'Array' 转换为 'int' : _data{ 值... }

所以我猜这个奇怪的错误信息会传播到你的列表初始化,因为它也使用了复制构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2016-08-14
    相关资源
    最近更新 更多