具有多态性的 C++ Final class

C++ Final class with polymorphism

我有一个摘要 class,它为我的应用程序定义了子模块的基本功能。 我们称这个摘要为 class IProdBridge.

IProdBridge包含虚拟和非虚拟方法以及一些纯虚拟方法。

因为该软件在多种不同的平台上运行,所以基础 class 处理大部分功能,而其专门处理特定于平台的功能(例如处理某些平台上的字节顺序)。

让我们称之为专门的 class TgurProdBridge.

简单地从基础 class IProdBridge 派生就可以了,但是我想将特化的 class 标记为 final,因此它可能不会被重写未来。

也许我现在只是脑袋放屁,但这就是我的专业 class 定义:

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(
                    "[[    3[1;34m%s3[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 支持进行编译。

为什么我会遇到这个问题?我应该能够将专门的 class 标记为最终的;否则 final 关键字将没有任何意义。

我发现了错误

这可能是 PEBKAC 最糟糕的情况之一,但也许这会像我一样避免其他人进行搜索。

我不完全确定为什么这没有导致过多的其他编译器错误,但问题出在我的命名空间上。

这个 class 嵌套在两个命名空间中:

namespace MyApp { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

然而,我的命名空间不是这样的:

namespace { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

为什么删除 final 关键字“修复”这个错误超出了我的理解范围。 抱歉浪费您的时间