VS2013 C ++编译器错误C3860解决方法?

时间:2015-08-27 13:24:53

标签: c++ templates visual-c++

我有以下代码使用GCC 4.8.3 C ++ 11编译得很好,而对于MSVC2013,它会对" DoSmth"的定义抛出以下错误: C3860:类模板名称后面的模板参数列表必须按模板参数列表中使用的顺序列出参数

以下是代码:

template <typename Bla3, typename Bla4>
class B
{
public:
    struct X
    {
        int a; 
        int b;
    };

    B() {}
    ~B() {}
};

template<typename Bla1, typename Bla2, typename Bla3>
class A
{
public:
    A() {}
    ~A() {}

    void DoSmth(struct B<Bla1, Bla3>::X var);
};


template<typename Bla1, typename Bla2, typename Bla3>
void A<Bla1, Bla2, Bla3>::DoSmth(struct B<Bla1, Bla3>::X var)
{

}

据我所知,从错误链接(https://msdn.microsoft.com/en-us/library/h2wky6zt.aspx)中,需要使用/ c进行编译才能使其正常工作,但这样会阻止自动链接。

有谁知道为什么这种限制必须以相同的顺序放置模板参数?如果有办法解决这个问题而不改变参数顺序?

1 个答案:

答案 0 :(得分:0)

这将起作用,也可能使您的代码更具可读性

template <typename Bla3, typename Bla4>
class B
{
public:
    struct X
    {
        int a;
        int b;
    };

    B() {}
    ~B() {}
};

template<typename Bla1, typename Bla2, typename Bla3>
class A
{
public:

    typedef B<Bla1, Bla3>           B_Type;
    typedef struct B_Type::X        X_Type;

    A() {}
    ~A() {}

    void DoSmth(X_Type var);
};

template<typename Bla1, typename Bla2, typename Bla3>
void A<Bla1, Bla2, Bla3>::DoSmth(X_Type var)
{
}