带有头文件的visual c++委托构造函数

visual C++ Delegated Constructors With Headers

本文关键字:c++ 构造函数 visual 文件      更新时间:2023-10-16

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

我正在使用微软的 c++十一月2012 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 &'

答::

不能在头文件中使用显式关键字。

只有第一个签名将工作的构造函数将与此工作。解决方案。

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

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

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