c++ - 指向模板抽象类的指针 vector ?

标签 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 }

最佳答案

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

因此,您不能创建类型为Foo*的指针。

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

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

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

然后使用:
std::vector<FooBase*> flubs;

关于c++ - 指向模板抽象类的指针 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332784/

相关文章:

c++ - 以下递归目录搜索和文件打开有什么问题?

c++ - 为什么编译器将此方法的返回类型报告为 void?

c++ - 跨模板特化共享的静态成员

.net - 'String' 的值不能转换为类型 'T' 。获取查询字符串的通用函数?

java - 为通用集合编写 contains()

c++ - cout 不显示 double 值

c++ - 模板实例化解析错误

C++:创建迭代器嵌套类的实例

java - 创建通用对象的缓存

C++ vector 作为类成员与函数中的比较