特殊结构/类中无法识别的数据成员

时间:2018-11-24 15:36:17

标签: c++ templates instantiation template-specialization assignment-operator

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

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的成员。这里有什么问题?

1 个答案:

答案 0 :(得分:2)

问题是,当在专业化X<B>的定义中实例化X<A>时(X<A>::operator =的定义要求),专业化{{1 }}尚不可见。这意味着它将是来自主模板的implicitly instantiated,后者没有成员X<B>a

您可以将b的定义移出专门化X<A>::operator =的定义之外,也可以移出X<A>专门化的定义之后。例如

X<B>