5

ネストされた名前空間にテンプレート クラスの前方宣言があります

namespace n1
{
    namespace n2
    {
        template <typename T, typename S>
        struct A;
    }
    using n2::A;
}

定義が続きますが、実際には別のファイルにあり、その間に次のものがあります。

struct X { };

namespace n1
{
    namespace n2
    {
        template <typename T, typename S = X>
        struct A { };
    }
    using n2::A;
}

次に、次は常に問題ありません。

n1::n2::A <int> a;

でもこのショートカット

n1::A <int> a;

clang でコンパイル エラーが発生する

error: too few template arguments for class template 'A'

前方宣言を削除しない限り。g++ は両方を受け入れます。

clang は、デフォルトのテンプレート引数を含まない最初の宣言にとどまっているようです (Xまだ定義していないため、含めることはできません)。

単一の名前空間を使用する場合は問題ありません (ただし、これは解決策ではありません)。

私は何を間違っていますか、またはどのコンパイラが正しいですか? ショートカットは、前方宣言およびネストされた名前空間とどのように連携できますか? 私はそれらすべてが必要です。

もちろん、前方宣言X+ S のデフォルト引数は機能しますが、面倒です (実際には数十あり、ファイル構造全体が変更されます)。

4

2 に答える 2