问题描述
我有一个抽象类,它为我的应用程序定义了子模块的基本功能。
我们称这个抽象类为 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,settings) {
getLoggerInstance() = new ConsoleLogger(__FUNCTION__,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
关键字没有任何意义。
解决方法
我发现了错误
这可能是 PEBKAC 最糟糕的情况之一,但也许这会像我一样避免其他人进行搜索。
我不完全确定为什么这不会导致大量其他编译器错误,但问题出在我的命名空间上。
这个类嵌套在两个命名空间中:
namespace MyApp { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
然而,我的命名空间看起来像这样:
namespace { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
我无法理解为什么删除 final
关键字“修复”了这个错误。
很抱歉浪费您的时间?