委托(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/