【问题标题】:partial template specialization in MSVC++2010 with defaultsMSVC++2010 中的部分模板特化,具有默认值
【发布时间】:2011-10-28 02:52:40
【问题描述】:

以下 sn-p 无法在 MSVC++2010 上编译(使用 gcc、icc 和 sun CC 可以正常编译):

#include <iostream>

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;
}

如果我从Point 声明中删除class A 的默认值,它编译得很好。非常感谢任何有关如何在不更改 Pair 的非专业声明(即template&lt; class P1, class P2 &gt; struct Pair;)的情况下解决此问题的建议。删除真实代码中的默认值也不是一种选择。

error C2079: 'p' uses undefined struct 'Pair<P1,P2>'
          with
          [
              P1=Point<float,3>,
              P2=Point<double,3>
          ]

【问题讨论】:

  • 您收到什么错误?
  • 您是否将第三个(默认)参数传递给struct Point?我的意思是 class A 始终是默认参数 Attribute&lt;T,D&gt; ?
  • 是的,我愿意,大多数时候它是默认的,但在某些情况下它是完全不同的类型。顺便说一句,这个 sn-p 仅用于演示。真正的代码要复杂得多,也更令人费解。
  • 您是否尝试过使用 3U 而不是 3?
  • 我刚试过,同样的错误。无论出于何种原因 VC++ 编译器不匹配专用模板并希望实例化非专用模板。

标签: c++ templates compiler-errors template-specialization visual-c++-2010


【解决方案1】:

Point 的第三个模板参数应该出现在特化中:

template<class T1, class T2, unsigned D>
struct Pair<Point<T1, D, Attribute<T1, D>>, Point<T2, D, Attribute<T2, D>>>
{ ... };

【讨论】:

  • 谢谢,这是朝着正确方向迈出的一步,但如果 T1/T2 本身是使用默认值分类的模板,则将无法正常工作(在 VC++ 上)。
  • 然后用这些默认值问另一个问题。
  • 事先不知道T1和T2是什么。
  • 当然不知道T1和T2是什么,这就是为什么要专门化的模板参数。我看不出这与当前问题有什么关系。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多