有人能告诉我为什么以下代码无法编译?我试图自己解决这个问题,但我发现的每个答案似乎都与手头的问题略有不同。以下是尝试编译的结果:
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 }
答案 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> *>
,但不能同时拥有两个容器。
(假设您可以很好地使用指针向量。)