VS2013 c++编译错误C3860的解决方法

VS2013 C++ Compiler Error C3860 workaround?

本文关键字:解决 方法 C3860 错误 c++ 编译 VS2013      更新时间:2023-10-16

我用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编译才能使此工作,但这会阻止自动链接。

有谁知道为什么必须按照相同的顺序放置模板参数的限制,如果有一种不改变参数顺序的方法?

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

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)
{
}