【问题标题】:C++ Delegated Constructors With Headers带有标头的 C++ 委托构造函数
【发布时间】:2012-12-30 02:58:11
【问题描述】:

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

构造函数只有第一个签名可以使用这个..解决方法。

【问题讨论】:

  • clang 和 gcc 都接受这个代码。您可以删除 VS 错误代码并用描述替换它们吗?另外,c11 到底在做什么?
  • 它应该可以工作(如 3 版本):见 stackoverflow.com/a/14183972/14065 并且看起来 VS2012 应该支持它:stackoverflow.com/a/7422058/14065
  • @LokiAstari 你是说你能做到吗?
  • @WindAndFlame:这是一个错误(见我的回答)。其他编译器会正确处理此问题,但来自 CTP 的编译器不会。
  • @WindAndFlame:不,我没有 VS2012

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


【解决方案1】:

这似乎是 CTP 中的一个错误。它还出现在 Stephan T. Lavavej 的this presentation 期间(从分钟 38:45 开始)。

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

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

【讨论】:

  • 我看到了同一个视频:channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/… ... 不幸的是,我按照他的建议删除了明确的内容,然后在我无法弄清楚为什么我无法获得资格时将它们放回去构造函数名称。所以回答:没有资格并删除明确的作品。我不知道这种缺乏资格是否意味着可疑的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多