プラエトリアニのコメントが述べているように、問題は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;。