4

なぜ私は得るのですか

エラーC2597:非静的メンバーへの不正な参照'derived<<unnamed-symbol>>::T'

このコードをVisualC++ 2010 x64でコンパイルしようとすると?(x86では問題ないようです...どちらが正しいですか?)

struct base { typedef int T; };

template<class>
struct derived : base
{
    using base::T;
    derived(T = T()) { }
};

int main()
{
    derived<int>();
    return 0;
}
4

3 に答える 3

3

プラエトリアニのコメントが述べているように、問題はT()デフォルト値にあります。エラーの詳細に基づいてusing base::T、コンパイラは、型のインスタンスの構築ではなく、のT()非静的メンバー関数の呼び出しとして検索するように混乱させているようです。baseT

これは、MSVC 2005 x86で機能する興味深い修正です(他のコンパイラは試していません)。T()それは保存されていることに注意してください。これにより、曖昧さが解消されるか、継承された型ではなく、継承された型を参照するようusing base::Tに強制されます(コンパイラにとっては明らかに同じではありません)。Tusing

//...
template<class>
struct derived : base
{
    using base::T;
    derived(T = static_cast<T>( T() )) { } //No error
};
//...

編集:これに変更baseしてみて、どのようなエラーメッセージが表示されるかを確認してください。

struct base { struct T{T(){}}; };

私はオリジナルを手に入れましたC2597が、これも:

エラーC2440:'デフォルト引数':''から'base :: T'に変換できませんコンストラクターがソース型を取得できないか、コンストラクターのオーバーロード解決があいまいでした

コンパイラが何を意味するのかはわかりませんが''、元の定義と同様の問題である可能性がありbaseます。行を削除すると、これは正常にコンパイルされますusing base::T;

于 2012-10-12T22:54:05.800 に答える
0

なぜ使うのusing base::T?基本クラスで定義されたタイプは、派生クラスで自動的に使用可能になります。

struct base { typedef int T; };
template< class X >
struct derived : base {};
derived<int>::T v = 0;  // this is OK in C++
于 2012-10-12T22:20:17.010 に答える
0

代わりにこれを使用してください(自明である必要があります):

template<class T>
struct derived : base
{
    derived(T = T()) { }
};
于 2012-10-12T22:27:38.413 に答える