指针传染媒介对模板抽象类?

时间:2017-04-10 20:58:12

标签: c++ templates generics compiler-errors 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("foobar\n"); };
 12 };
 13
 14 class Baz : public Foo<Baz> {
 15   public:
 16     void f() const { printf("foobaz\n"); };
 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 }

3 个答案:

答案 0 :(得分:4)

Foo是一个类模板,而不是一个类。

因此,您无法创建类型为Foo*的指针。

解决这个问题的方法是创建一个基类。

class FooBase
{
   public:
      virtual void f() const = 0;
};

template <class T>
class Foo : public FooBase
{
};

然后使用:

std::vector<FooBase*> flubs;

答案 1 :(得分:0)

您无法获取模板类的指针 - 模板类仅存在于编译器中。编译器决定需要哪些实例('类'),并生成那些实例;但模板类本身在结果中不再存在。

答案 2 :(得分:0)

总结一下,您可以拥有std::vector<Foo<Bar> *>std::vector<Foo<Baz> *>,但不能同时拥有两个容器。

(假设您可以很好地使用指针向量。)

相关问题