【发布时间】:2021-06-21 02:20:51
【问题描述】:
我有一个抽象类,它为我的应用程序定义了子模块的基本功能。
我们称这个抽象类为IProdBridge。
IProdBridge 包含虚拟和非虚拟方法以及一些纯虚拟方法。
由于该软件可在多种不同平台上运行,因此基类处理大部分功能,而其特化处理特定于平台的功能(例如,在某些平台上处理字节序)。
让我们调用专门的类TgurProdBridge。
简单地从基类IProdBridge 派生就可以了,但是我想将专用类标记为final,因此将来可能不会被覆盖。
也许我现在只是在放屁,但这就是我的专业类定义的样子:
class TgurProdBridge final: public IProdBridge {
// ^ error: expected class-name before ‘{’ token
public: // +++ Static +++
static TgurProdBridge& getInstance(milliseconds loopInterval = milliseconds(-1), ProdResponseCallback callback = {},
json settings = "{}"_json, LogLevel logLevel = LOGLEVEL_MAXVALUE, string logPath = "") {
static TgurProdBridge* instance = nullptr;
if (instance == nullptr) {
if (loopInterval == DEFAULT_MS || !callback || settings.empty() || logLevel == LOGLEVEL_MAXVALUE || logPath.size() == 0) {
throw getSysError(0xbada79, "Invalid arguments passed for object instantiation! Did you set all the arguments?");
}
instance = new TgurProdBridge(loopInterval, callback, settings, logLevel, logPath);
}
return instance;
}
public: // +++ Destructor +++
~TgurProdBridge() { }
private: // +++ Constructor / Destructor +++
TgurProdBridge(milliseconds loopInterval, ProdResponseDataCallback callback, json settings, LogLevel logLevel, string logPath):
IProdBridge(loopInterval, callback, settings) {
getLoggerInstance() = new ConsoleLogger(__FUNCTION__, logLevel, true, 0, true, true, logPath, 128);
getLoggerInstance()->setCurrentApplicationName(__FUNCTION__);
getLoggerInstance()->setCurrentLoggerFormat(
"[[ \033[1;34m%s\033[0m ]] [%s] [%s] %s",
ILogger::LOG_FMT_APPNAME.c_str(),
ILogger::LOG_FMT_DATETIME.c_str(),
ILogger::LOG_FMT_LOGLVL.c_str(),
ILogger::LOG_FMT_MSG.c_str()
);
}
private: // +++ Const Static (Defaults) +++
};
由于某种原因,我的编译器 (g++ 6) 抛出以下错误:
error: expected class-name before ‘{’ token
class TgurProdBridge final: public IProdBridge {
^
我正在使用 C++ 14 支持进行编译。
为什么我会遇到这个问题?我应该能够将专业课程标记为最终课程;否则final 关键字没有任何意义。
【问题讨论】:
-
您是说删除
final可以消除错误吗? -
是的,删除 final 消除了错误。
-
这个错误听起来像是 gcc 遇到了
IProdBridge的问题。 -
这能回答你的问题吗? error: expected class-name before ‘{’ token
-
@SimonC 我的意思是 我们 可以用来重现错误的示例。正如您的回答所示,您涉及的
namespaces 未在问题中显示。该问题还包括重现错误所不需要的很多内容 - 但不是重现错误所需的所有内容(对我们而言)。
标签: c++ inheritance polymorphism final