プラエトリアニのコメントが述べているように、問題はT()
デフォルト値にあります。エラーの詳細に基づいてusing base::T
、コンパイラは、型のインスタンスの構築ではなく、のT()
非静的メンバー関数の呼び出しとして検索するように混乱させているようです。base
T
これは、MSVC 2005 x86で機能する興味深い修正です(他のコンパイラは試していません)。T()
それは保存されていることに注意してください。これにより、曖昧さが解消されるか、継承された型ではなく、継承された型を参照するようusing base::T
に強制されます(コンパイラにとっては明らかに同じではありません)。T
using
//...
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;
。