专用结构/类中无法识别的数据成员

Not Recognized Data Members in Specialized Structs/Classes

提问人:nmd_07 提问时间:11/24/2018 最后编辑:songyuanyaonmd_07 更新时间:11/25/2018 访问量:32

问:

为了包含条件数据成员,我使用专用模板而不是命名空间,然后在每个专用化中重载赋值运算符。在编译过程中,无法识别专用化的成员变量。我不明白为什么,在互联网上也找不到任何东西。

enum Def : int {A, B};

template<Def T>
struct X {};

// Forward declaration does not help, like it would in non-template implementations. 
/*
*     template<>
*     struct X<B>;
*/

template<>
struct X<A>
{
    int a;
    int b;
    X<A> & operator = (const X<B> & obj)
    {
         a = obj.a;
         b = obj.b;
    }
}

template<>
struct X<B>
{
    int a;
    int b;
    int c;
    int d;
    X<B> & operator = (const X<A> & obj)
    {
         a = obj.a;
         b = obj.b;
    }
}

现在发生的事情是,在编译时,我得到没有成员命名和的错误。这里有什么问题?X<B>ab

C++ 模板 实例化 template-specialization 赋值运算符

评论


答:

2赞 songyuanyao 11/24/2018 #1

问题是,当在专用化的定义中实例化时(这是 的定义所要求的),专用化的定义还不可见。这意味着它将从主模板隐式实例化,该模板没有 member 和 。X<B>X<A>X<A>::operator =X<B>ab

您可以将 的定义移出专业化的定义,并在专业化定义之后移动 。例如:X<A>::operator =X<A>X<B>

template<>
class X<A>
{
    int a;
    int b;
    X<A> & operator = (const X<B> & obj);
};

template<>
class X<B>
{
    ...
};

X<A> & X<A>::operator = (const X<B> & obj)
{
     a = obj.a;
     b = obj.b;
}

评论

0赞 nmd_07 11/24/2018
谢谢,这很好地解释了这一点。