带 header 的 C++ 委托(delegate)构造函数

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

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

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

我正在尝试使用命名空间和头文件进行委托(delegate)构造...我不确定这是否属于尚未在 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 中的一个错误。它也会出现在this presentation期间作者:Stephan T. Lavavej(参见 38:45 分钟起)。

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

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

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

相关文章:

c++ - 绘制二维条纹

c++ - 整数到字符串优化函数?

c++ - 自动类型说明符

c++ - 使用 VS2012 和 DirectX 的警告(2010 年 6 月)

c++ - glTexImage3D 抛出异常

java - 未编译 "base operand of ‘->’ 的 JNI IMU 代码具有非指针类型 ‘JNIEnv’“

c++ - streampos 和 pos_type、streamoff 和 off_type 有什么区别?

c++ - 在结构或类中使用智能指针

c++ - 在 Windows 服务中使用命名管道时出现问题

c++ - 日志(PCTSTR 格式,...)和日志(PCTSTR 文本): error C2668 ambiguous call to overloaded function