MSVC ++ 2010における部分テンプレートの特殊化

以下のスニペットは、MSVC ++ 2010でコンパイルされません(gcc、icc、およびsun CCでうまくコンパイルされます)。

#include 

template< class T, unsigned D > struct Attribute
{
    T attr[D];
};

template< class T, unsigned D, class A = Attribute< T, D > > struct Point
{
    T coor[D];
    A a;
};

template< class P1, class P2 > struct Pair;

template< class T1, class T2, unsigned D > struct Pair< Point< T1, D>, Point< T2, D > >
{
    Point< T1, D> p1;
    Point< T2, D> p2;

    static const char * id()
    {
        return "specialized";
    }
};

int main()
{
    Pair< Point< float, 3>, Point< double, 3> > p;

    std::cout << p.id() << std::endl;

    return 0;
}

If I remove a default for class A from Point declaration it compiles just fine. Any suggestions on how to work around this issue without changing non-specialized declaration of Pair (i.e., template< class P1, class P2 > struct Pair;) are greatly appreciated. Removing defaults in the real code is not an option either.

error C2079: 'p' uses undefined struct 'Pair'
          with
          [
              P1=Point,
              P2=Point
          ]
2
3番目(デフォルト)の引数を struct Point に渡していますか?つまり、 class A は常にデフォルトのパラメータ Attribute ですか?
追加された 著者 iammilind,
3ではなく3Uを使ってみましたか?
追加された 著者 Alan Stokes,
あなたはどんなエラーを受けていますか?
追加された 著者 Michael Price,
私はOPにエラーを追加します
追加された 著者 Noil Noil,
はい、そうですが、ほとんどの場合デフォルトですが、場合によっては完全に異なるタイプです。この抜粋はデモンストレーション用です。実際のコードははるかに複雑で、はるかに複雑です。
追加された 著者 Noil Noil,
私はちょうど同じエラーを試みた。 VC ++コンパイラが特殊化されたテンプレートと一致せず、特殊化されていないものをインスタンス化したいという理由が何であっても。
追加された 著者 Noil Noil,

1 答え

Pointの3番目のテンプレートパラメータは、スペシャライゼーションに表示されます。

template
struct Pair>, Point>>
{ ... };
2
追加された
次に、これらのデフォルトで別の質問をしてください。
追加された 著者 Adam Mitz,
もちろん、T1とT2が何であるかは分かっていないので、専門化のテンプレートパラメータがその理由です。私はそれが現在の質問にどのように関連しているのか分かりません。
追加された 著者 Adam Mitz,
おかげさまで、これは正しい方向への一歩ですが、T1/T2自体がデフォルトでクラスター化されている場合はVC ++で動作しません。
追加された 著者 Noil Noil,
あらかじめT1とT2が何であるかはわかりません。
追加された 著者 Noil Noil,