Неопознанные члены данных в специализированных структурах / классах - PullRequest
0 голосов
/ 24 ноября 2018

Для включения элементов условных данных я использую специализированные шаблоны вместо пространств имен, а затем перегружаю оператор присваивания в каждой специализации.Во время компиляции переменные-члены специализаций не распознаются.Я не понимаю, почему, и ничего не могу найти в интернете.

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> не имеет члена с именем a и b.В чем здесь проблема?

1 Ответ

0 голосов
/ 24 ноября 2018

Проблема в том, что когда X<B> создается внутри определения специализации X<A> (что требуется по определению X<A>::operator =), определение специализации X<B> еще не видно.Это означает, что он будет неявно создан из основного шаблона, в котором нет элементов a и b.

. Вы можете переместить определение 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...