【问题标题】:Vector of pointers to template abstract class?指向模板抽象类的指针向量?
【发布时间】:2017-04-10 20:58:12
【问题描述】:

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

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 }

【问题讨论】:

  • template&lt;class T&gt; class Foo 是一个模板类。没有Foo 类(无模板),因此没有Foo*
  • 为什么Foo是一个模板类?你不能用非泛型的Foo 类实现你想要的功能吗?
  • 为什么 Foo 是一个模板?它没有使用它的模板参数。
  • 这只是一个玩具程序来说明我遇到的真正问题。
  • @Xirema,n.m.,我明白你的意思,你说得对,这里不需要模板。

标签: c++ templates generics compiler-errors abstract-class


【解决方案1】:

Foo 是类模板,而不是类。

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

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

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

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

然后使用:

std::vector<FooBase*> flubs;

【讨论】:

    【解决方案2】:

    您不能获取模板类的指针 - 模板类仅为编译器而存在。编译器决定需要哪些实例(“类”)并生成这些实例;但是模板类本身不再存在于结果中。

    【讨论】:

      【解决方案3】:

      总而言之,您可以拥有std::vector&lt;Foo&lt;Bar&gt; *&gt; 或std::vector&lt;Foo&lt;Baz&gt; *&gt;,但不能同时在同一个容器中。

      (假设您可以找到 指针向量 的好用处。)

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        相关资源
        最近更新 更多