指向模板抽象类的指针向量

Vector of pointers to template abstract class?

本文关键字:指针 向量 抽象类      更新时间:2023-10-16

有人可以告诉我为什么下面的代码无法编译吗?我试图自己弄清楚这一点,但我找到的每个答案似乎都与手头的问题略有不同。以下是尝试编译的结果:

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> *> ,但不能同时在同一个容器中。

(假设你能找到指针向量的良好用途。