c++向量模板参数1无效

Posted

技术标签:

【中文标题】c++向量模板参数1无效【英文标题】:c++ vector template argument 1 is invalid 【发布时间】: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 的观点。虽然存在关系,但智能指针与指针不同。 【参考方案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

【讨论】:

以上是关于c++向量模板参数1无效的主要内容,如果未能解决你的问题,请参考以下文章

c++ 使用友好类的类型作为模板参数声明 stl 向量

模板参数无效(唯一指针)

我可以键入检查模板参数吗? (C++)[重复]

没有参数列表的模板名称“ ”的使用无效

为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]

模板编程向量 C++