c++ - MSVC++2010 中带有默认值的部分模板特化

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

以下代码片段无法在 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;
}

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

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

最佳答案

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

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

关于c++ - MSVC++2010 中带有默认值的部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924638/

相关文章:

c - 减少 C 程序的大小以适应 qr 代码

c++ - 使用enable_if来防止声明?

C++ boost - 是否有一个容器像队列一样工作,可以直接访问 key ?

c++ - C++ 检测惯用法在 Visual Studio 2015 Update 2 CTP 中未按预期工作

c++ - 将多种类型的模板化类存储到容器中

java - 是什么原因导致这个 "Incompatible operand types int and java.lang.String"

c++ - 计算构成给定 IP 范围的子网列表

c++ - 如何强制 std::weak_ordering

c++ - 没有默认构造函数的模板的模板

c# - 我不明白为什么第一个正确,但是第二个失败