委托(delegate)施工问题:
编译器错误C2039:'{ctor}'不是Logging::LogManager的成员

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

我正在尝试使用 namespace 和头文件来委派构造,以便工作……我不确定这是否属于尚未在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已知的每个已知错误,无法在头文件中使用显式关键字。

只有第一个签名将对构造方法起作用。

最佳答案

这似乎是CTP中的错误。斯蒂芬·拉瓦维(Stephan T.Lavavej)在this presentation期间也出现过(见分钟38:45)。

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

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

关于c++ - 具有标题的C++委托(delegate)构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14347428/

10-11 18:56