指向模板抽象类的指针向量
Vector of pointers to template abstract class?
有人可以告诉我为什么下面的代码无法编译吗?我试图自己弄清楚这一点,但我找到的每个答案似乎都与手头的问题略有不同。以下是尝试编译的结果:
jefferson@ubuntu:~$ g++ -std=c++14 templates.cpp
templates.cpp: In function ‘int main()’:
templates.cpp:26:19: error: template argument 1 is invalid
std::vector<Foo*> flubs;
^
templates.cpp:26:19: error: template argument 2 is invalid
这是有问题的代码:
1 #include <stdio.h>
2 #include <vector>
3 template <class T>
4 class Foo {
5 public:
6 virtual void f() const = 0;
7 };
8
9 class Bar : public Foo<Bar> {
10 public:
11 void f() const { printf("foobarn"); };
12 };
13
14 class Baz : public Foo<Baz> {
15 public:
16 void f() const { printf("foobazn"); };
17 };
18
19 int
20 main()
21 {
22 Bar bar = Bar();
23 Baz baz = Baz();
24 bar.f();
25 baz.f();
26 std::vector<Foo*> flubs;
27 return 0;
28 }
Foo
是一个类模板,而不是一个类。
因此,不能创建类型为 Foo*
的指针。
解决此问题的方法是创建一个基类。
class FooBase
{
public:
virtual void f() const = 0;
};
template <class T>
class Foo : public FooBase
{
};
然后使用:
std::vector<FooBase*> flubs;
你不能拿模板类的指针 - 模板类只存在于编译器中。编译器决定需要哪些实例("类"(,并生成这些实例;但是模板类本身在结果中不再存在。
总而言之,你可以有一个 std::vector<Foo<Bar> *>
或 std::vector<Foo<Baz> *>
,但不能同时在同一个容器中。
(假设你能找到指针向量的良好用途。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量