带标题的C ++委托构造函数

时间:2013-01-15 21:38:54

标签: c++ visual-c++ c++11 constructor visual-studio-2012

委托建设问题: 编译器错误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已知的已知错误,无法在头文件中使用显式关键字。

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

1 个答案:

答案 0 :(得分:2)

这似乎是CTP中的一个错误。它也出现在Stephan T. Lavavej的this presentation期间(见最后38:45)。

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

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