Хобрук: Ваш путь к мастерству в программировании

Требуется справка по устранению ошибки C2664

У меня есть следующий код, который дает мне эту ошибку

main.cpp (41): ошибка C2664: 'std :: pair std :: make_pair (_Ty1, _Ty2)': невозможно преобразовать аргумент 1 из 'Handle' в 'unsigned int &'

Моя примерная программа

#include <vector>
#include <utility>
typedef unsigned int u32;
typedef u32 Handle;

struct File
{
    File()
        : ch(0),
        pageIdx(0)
    {
    }
    Handle ch : 8;
    u32 pageIdx;
};

int main() {
    std::vector<std::pair<Handle, u32> > toTrim;
    toTrim.reserve(64);
    File* m_pFirstPage = new File();
    File* pRef = m_pFirstPage;
    toTrim.push_back(std::make_pair(pRef->ch,pRef->pageIdx));
    return 0;
}

Когда я пытаюсь выполнить статическое приведение, т.е.

toTrim.push_back(std::make_pair(static_cast<unsigned int>(pRef->ch), pRef->pageIdx));

Я получаю следующую ошибку

main.cpp (41): ошибка C2664: 'std :: pair std :: make_pair (_Ty1, _Ty2)': невозможно преобразовать аргумент 1 из 'unsigned int' в 'unsigned int &'

Может ли кто-нибудь помочь мне решить эту проблему и объяснить, что я делаю неправильно.

12.03.2015

  • Не думаю, что ему нравится битовое поле. Почему бы не использовать 8-битное целое число, если вы этого хотите? Также почему вы динамически выделяете файловый объект? 12.03.2015
  • Мой ответ удален, так как я думаю, что это может быть проблема с компилятором, ваша версия с static_cast отлично работает для меня на GCC 5. Какой компилятор вы используете? 12.03.2015
  • для обозначения ошибки C2664 я бы сказал VC ++ 12.03.2015
  • Я запускаю код на Microsoft Visual Studio Professional 2013 12.03.2015
  • вам нужно: 8 обозначений? без него он компилируется правильно 12.03.2015

Ответы:


1

Что происходит, так это то, что вы указываете битовые поля с обозначением : 8.

Дополнительная информация: http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm

Это создает поле псевдосимвола в вашей переменной дескриптора из 8 бит вместо 32, как определяет typedef u32 Handle. std::make_pair требует передачи аргументов по ссылке.

Поскольку Handle ch : 8 отличается от типа Handle, вы не можете передать его по ссылке, потому что считается неопределенным поведением, приводящим переменную, которая передается по ссылке.

Дополнительная информация: Как преобразовать переменный член, чтобы передать его в качестве ссылочного аргумента функции

Если вам нужно поле : 8, вы можете использовать дополнительную переменную для правильного создания пары.

#include <vector>
#include <utility>
typedef unsigned int u32;
typedef u32 Handle;

struct File
{
    File()
    : ch(0),
    pageIdx(0)
    {
    }
    Handle ch : 8; //Different type than just Handle
    u32 pageIdx;
};

int main() {
    std::vector<std::pair<Handle, u32> > toTrim;
    toTrim.reserve(64);
    File* m_pFirstPage = new File();
    File* pRef = m_pFirstPage;
    unsigned int ch_tmp = pRef->ch; //<-Extra variable here
    toTrim.push_back(std::make_pair(ch_tmp, pRef->pageIdx));
    return 0;
}
12.03.2015
  • Большое спасибо за объяснение по удалению: 8, код компилируется. 12.03.2015
  • Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..