2

委任された構築の質問: コンパイラエラーC2039:'{ctor}'はLogging::LogManagerのメンバーではありません

VisualStudio2012のデフォルトではなくMicrosoftのC++2012年11月CTPコンパイラを使用しているため、新しいC ++機能(可変個引数テンプレートなど)にアクセスできます。

名前空間とヘッダーファイルを使用して委任された構造を機能させようとしています...これが、VisualStudio2012でまだ実装されていない基本コンストラクターの継承機能に該当するかどうかはわかりません。したがって、これが機能することを期待すべきではない場合があります。

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'から'constLogging :: LogManager&'に変換できません

回答:: Microsoftがすでに知っている既知のバグにより、ヘッダーファイルで明示的なキーワードを使用することはできません。

コンストラクターの最初の署名のみが機能し、この回避策で機能します。

4

1 に答える 1

2

これはCTPのバグのようです。また、Stephan T. Lavavejによるこのプレゼンテーション中に表示されます(38:45分から参照)。

考えられる唯一の回避策はexplicit、プロジェクトで許容できる場合は、修飾子を削除することです。それ以外の場合は、明示的なコンストラクターに委任することは避けてください。

特に、これは継承されたコンストラクターとは関係ありません。これは別の機能であり、CTPではサポートされていません(Stephan T. Lavavejがリンクした同じプレゼンテーションで述べているように、バグが発生してからわずか数分後)。

于 2013-01-15T21:44:42.843 に答える