【发布时间】:2017-07-14 04:00:04
【问题描述】:
如何定义一个模板类继承自模板类?
我想将std::queue 和std::priority_queue 包装到一个基类中。在我的情况下是LooperQueue。
我这样使用StdQueueauto queue = new StdQueue<LooperMessage *>()。
我的类定义编译器抱怨
错误日志:
In file included from /Users/rqg/ASProjects/PboTest/muses/src/main/cpp/Painter.cpp:10:
/Users/rqg/ASProjects/PboTest/muses/src/main/cpp/util/StdQueue.h:14:5: error: unknown type name 'size_type'; did you mean 'size_t'?
size_type size() override;
^~~~~~~~~
size_t
/Users/rqg/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/5.0.300080/include/stddef.h:62:23: note: 'size_t' declared here
typedef __SIZE_TYPE__ size_t;
^
In file included from /Users/rqg/ASProjects/PboTest/muses/src/main/cpp/Painter.cpp:10:
/Users/rqg/ASProjects/PboTest/muses/src/main/cpp/util/StdQueue.h:16:5: error: unknown type name 'reference'
reference front() override;
^
/Users/rqg/ASProjects/PboTest/muses/src/main/cpp/util/StdQueue.h:20:21: error: unknown type name 'value_type'; did you mean 'ARect::value_type'?
void push(const value_type &x) override;
^~~~~~~~~~
ARect::value_type
/Users/rqg/Library/Android/sdk/ndk-bundle/sysroot/usr/include/android/rect.h:44:21: note: 'ARect::value_type' declared here
typedef int32_t value_type;
代码:
#ifndef PBOTEST_LOOPERQUEUE_H
#define PBOTEST_LOOPERQUEUE_H
#include <queue>
#include <cstdlib>
template<typename Tp, typename Sequence = std::deque<Tp> >
class LooperQueue {
public:
typedef typename Sequence::value_type value_type;
typedef typename Sequence::reference reference;
typedef typename Sequence::const_reference const_reference;
typedef typename Sequence::size_type size_type;
typedef Sequence container_type;
virtual size_type size() = 0;
virtual reference front() = 0;
virtual void pop()= 0;
virtual void push(const value_type &x) = 0;
};
#endif //PBOTEST_LOOPERQUEUE_H
#ifndef PBOTEST_STDQUEUE_H
#define PBOTEST_STDQUEUE_H
#include "LooperQueue.h"
template<typename Tp, typename Sequence = std::deque<Tp> >
class StdQueue : public LooperQueue<Tp, Sequence> {
public:
size_type size() override;
reference front() override;
void pop() override;
void push(const value_type &x) override;
public:
private:
std::queue<Tp, Sequence> mQueue;
};
#endif //PBOTEST_STDQUEUE_H
【问题讨论】:
-
发布没有文件名和行号的编译器错误很臭。另外,我建议使用 'using' 而不是 typedef。语法更清晰,我认为它有时也可以提供更好的错误消息。
-
另外,您不能使用以下划线后跟大写字母开头的名称,或任何以下划线开头的名称。例如,_Sequence 是不允许的。 stackoverflow.com/a/228797/493106
-
@xaxxon 任何带有两个连续下划线的标识符 anywhere 都是不允许的
-
@xaxxon 对我的错误日志帖子感到抱歉。我删除了下划线,但错误保持不变。我不明白“
using而不是 typedef”。有没有更详细的
标签: c++ class templates inheritance name-lookup