【问题标题】:c++ vector template argument 1 is invalidc++向量模板参数1无效
【发布时间】:2015-12-19 11:52:19
【问题描述】:

我在File.h 中写了一个File 类。我在Directory.h 中编写了目录类,其中包含File& 向量。两个标头具有相同的命名空间。

代码如下:

#include "File.h" 
#include <vector>

class Directory : public File
{
public:
    ...

private:
    std::vector<(File&)> files; 
};

当我尝试编译它时,它说:

In file included from Directory.cpp:1:0:
Directory.h:29:30: error: template argument 1 is invalid
         std::vector<(File&)> files; 
                              ^
Directory.h:29:30: error: template argument 2 is invalid

【问题讨论】:

  • 您不能拥有std::vector 的引用类型。类型必须是可复制的。有什么理由不使用std::vector&lt;File&gt;
  • 那我应该使用指针吗?谢谢。
  • 你需要它们吗?多态性?
  • 不,它不会工作。最好是有智能指针向量。
  • 你错过了 LogicStuff 的观点。虽然存在关系,但智能指针与指针不同。

标签: c++ templates vector reference


【解决方案1】:

为了让你明白,std::vector 要求它的元素是 CopyAssignable,而引用不是。

std::vector&lt;File&amp;&gt; 是对File 的引用向量,注意std::vector&lt;(File&amp;)&gt; 是一个语法错误。

您认为std::vector&lt;File&gt; &amp; 会起作用,但没有。它是对什么向量的引用?对象。多态在那里不起作用。你需要一个实际的 std::vector&lt;File&gt; 实例来引用。

您需要一个指针向量,可以复制分配。

如果你使用原始指针,你不需要在删除任何元素之前忘记delete,否则你会泄漏内存(当然,如果一个对象是在堆上分配的)。智能指针将为您做到这一点:

std::vector<std::shared_ptr<File>> files;
// or
std::vector<std::unique_ptr<File>> files;

参考:std::shared_ptrstd::unique_ptr

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2014-03-14
    • 2020-10-26
    相关资源
    最近更新 更多