Сравнение типов шаблонов в операторе == перегрузка

0

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

Это код

bool operator==(const Queue<T>& queue)
    {
        NodoCS<T>* NodoA = First;
        NodoCS<T>* NodoB = coda.First;

        if (this->DimQueue() != coda.DimQueue())
            return false;
        else
        {
            for (int i = 0; i < DimQueue(); i++)
            {
                if (NodoA->Element() != NodoB->Element())
                    return false;

                NodoA = NodoA->NextAddress();
                NodoB = NodoB->NextAddress();
            }

            return true;
        }
    }

Пример: у меня есть очереди:

Queue<int> queue1 и Queue<string> queue2

Очевидно, что они не равны, поэтому как я могу контролировать, что int отличается от строки?

Я попытался написать параметр функции таким образом:

const Queue<T1>& queue

и тогда, if(T != T1).... но это неправильно

  • 0
    Хорошо, если тип шаблона T в аргументе функции совпадает с типом элемента для Queue , вы даже не сможете скомпилировать queue1 == queue2 .
  • 0
    Хотите ли вы сравнить Queue<string> с Queue<int> amd, если да, то почему?
Теги:
templates
types
operator-keyword
queue

2 ответа

2

Просто напишите перегрузку operator== которая сравнивает очереди одного и того же типа, а другая для очередей разных типов. Последний возвращает false всегда:

template<typename T>
bool operator==( const foo<T>& lhs , const foo<T>& rhs )
{
    return /* queues comparison */;
}

template<typename T , typename U>
bool operator==( const foo<T>& lhs , const foo<U>& rhs )
{
    return false;
}

Вот пример на идеоне.

  • 0
    Покончи с SFINAE и U в первом.
  • 0
    @ Якк, это правда, я слишком усложнил эту вещь ... Спасибо :)
Показать ещё 4 комментария
-2

Если вы используете boost или С++ 11,

template<typename U>
typename std::enable_if<std::is_same<T, U>, bool>::type
operator == (const Queue<U>& other)
{
    ... do member comparison here
}

template<typename U>
typename std::disable_if<std::is_same<T, U>, bool>::type
operator == (const Queue<U>& other)
{
    return false;
}
  • 0
    Хорошо, у меня есть эти ошибки, и у меня нет никаких идей о том, как их обрабатывать: 'Queue <std :: string> :: First': Невозможно получить доступ к закрытому члену, объявленному в классе 'Queue <std :: string>' (строка второго типа) ... '! =' бинарный: не найдено ни одного оператора, который принимает левый операнд типа int.
  • 0
    C ++ 11 не имеет disable_if , только Boost имеет.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню