Arhn - архитектура программирования

Возможная потеря метода для базовых объектов при использовании шаблонного объявления

Это приложение ответа в этой теме. -types/22390396#22390396">Как вернуть самый большой тип в списке типов?

где шаблон позволяет определить тип, который является максимальным из двух объектов.

Я как-то теряю метод int по виду сообщения об ошибке компилятора.

Вот код:

#include <iostream>

template<typename A>
struct givenType {
    typedef A type;
};

template<typename A, typename B>
struct largestType {
    typedef typename givenType<std::conditional<sizeof(A) <= sizeof(B), B, A         >>::type type;
};


template<typename T1, typename T2>
class Alpha {
public:
    typedef typename largestType<T1,T2>::type bigT3;
    Alpha() {};

    bigT3 answer(void) {
        bigT3 t;
        return t;
    }

    void tryCout(void) {
        std::cout << answer() << std::endl;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    Alpha<int,int> a;
    a.tryCout();
    return 0;
}

вместе со следующей ошибкой:

ошибка C2679: двоичный '‹‹': не найден оператор, который принимает правый операнд типа 'std::conditional‹_Test,_Ty1,_Ty2>' (или нет приемлемого преобразования) с

[
    _Test=true,
    _Ty1=int,
    _Ty2=int
]

Спасибо.

13.03.2014

Ответы:


1

Вы пытаетесь отправить всю структуру std::conditional в std::cout (теперь Big3 такой же, как std::conditional с typedef int).

std::conditional дает вам выбранный тип через его typedef type. Вы должны использовать это.

typename std::conditional<sizeof(A) <= sizeof(B), B, A>::type
                                                         ^^^^

так все должно выглядеть

template<typename A, typename B>
struct largestType {
    typedef typename givenType<
                       typename 
                       std::conditional<
                         sizeof(A) <= sizeof(B)
                         , B
                         , A
                       >::type // You missed this type
                     >::type type;
};

Однако вам действительно не нужна структура шаблона givenType. вы можете просто использовать один из conditional

template<typename A, typename B>
struct largestType {
    typedef typename 
              std::conditional<
                sizeof(A) <= sizeof(B)
                , B
                , A
              >::type type;
};

Или просто

template<typename T1, typename T2>
class Alpha {
public:
    typedef typename 
              std::conditional<
                sizeof(T1) <= sizeof(T2)
                , T2
                , T1
              >::type bigT3;
13.03.2014
  • Спасибо, не могу проголосовать из-за отсутствия репутации, но работает хорошо. Обратите внимание, что двойное имя типа также требуется при использовании вложенных шаблонов. 14.03.2014
  • @user3417339 user3417339 Да, вам нужно «имя типа». однако казалось, что вы уже знали это, поскольку правильно используете его в других местах. Поэтому я не акцентировал на этом больше внимания. вы не можете голосовать, но вы все равно можете принять ответ :) 14.03.2014

  • 2

    Ошибка о << вполне может быть связана с наличием вложенных открытий <> где-то рядом друг с другом в (более старых?) компиляторах C++, которые транслируются в оператор сдвига влево, полная ерунда в этом контексте (и, следовательно, источник непонятных сообщений об ошибках) . Замените << на < < (пробел между ними).

    13.03.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..