【发布时间】:2019-07-13 11:44:36
【问题描述】:
我正在通过尝试为 STL 容器实现类型擦除模式来练习类型擦除模式,但我坚持使用这些容器的纯虚拟成员函数。我不知道如何实现类型擦除模式的“概念”,它充当接口,持有被擦除类型共享的纯虚成员函数。 Push 之类的函数将需要一个编译时已知参数。据我了解,虚函数不能使用自动或模板化,那我该如何编写接口呢?
我尝试使用关键字'typename'告诉编译器稍后会给出类型,但它没有编译。
这是我目前所拥有的“概念”界面:
class Concept{
public:
virtual void push(typename T val) = 0;
virtual typename T pop() = 0;
};
目前收到的错误是这样的:
error: expected nested-name-specifier before ‘T’ virtual void push(typename T val) = 0;
^
error: expected ‘,’ or ‘...’ before ‘val’ virtual void push(typename T val) = 0;
^~~
error: expected nested-name-specifier before ‘T’ virtual typename T pop() = 0;
如果有人能就此给我一些建议,我将不胜感激。提前感谢大家的热心帮助和时间。
【问题讨论】:
-
如果结构/类本身是一个模板,没有什么能阻止虚函数使用模板类型。你只是不能让虚函数本身成为模板。
标签: c++ type-erasure pure-virtual