2

委托构建问题: 编译器错误 C2039:“{ctor}”不是 Logging::LogManager 的成员

我正在使用 Microsoft 的C++ 2012 年 11 月 CTP 编译器,而不是 Visual Studio 2012 中的默认编译器,因此我可以访问新的 C++ 功能(可变参数模板等)。

我正在尝试使用命名空间和头文件让委托构造工作......我不确定这是否属于尚未在 Visual Studio 2012 中实现的基本构造函数继承功能;所以,我可能不应该期望这会起作用:

你如何在 C++ 11 中做到这一点?

// LogManager.h extract

namespace Logging {
    class LogManager
    { 
private:
            static std::wstring defaultFileName;
            explicit LogManager(std::wstring logFileName);
            explicit LogManager();
          ~LogManager(void);
}

// LogManager.cpp extract
/********************************************************************
*****/
Logging::LogManager::LogManager(std::wstring fileName)
{}

/********************************************************************
*****/
Logging::LogManager::LogManager()
    : LogManager(defaultFileName) // Yields C2664     
 // : Logging::LogManager::LogManager(defaultFileName) // Yields C2039
 // : Logging::LogManager(defaultFileName) // Yields C2614 

{} 

错误 C2039:“{ctor}”:不是“Logging::LogManager”的成员

错误 C2614:“Logging::LogManager”:非法成员初始化:“LogManager”不是基础或成员

错误 C2664:“Logging::LogManager::LogManager(const Logging::LogManager &)”:无法将参数 2 从“std::wstring”转换为“const Logging::LogManager &”

回答:: 根据 Microsoft 已知的已知错误,不能在头文件中使用显式关键字。

只有构造函数的第一个签名才能使用这个.. 解决方法。

4

1 回答 1

2

这似乎是 CTP 中的一个错误。它也出现在Stephan T. Lavavej 的演讲中(见分钟 38:45)。

唯一可能的解决方法是删除explicit限定符,如果这在您的项目中是可以接受的。否则,只需避免委托给显式构造函数。

特别是,这与继承的构造函数无关,这是一个不同的功能,CTP 不支持(正如 Stephan T. Lavavej 在我链接的同一个演示文稿中所说 - 就在错误发生几分钟后)。

于 2013-01-15T21:44:42.843 回答