Использование typedef uint вызывает ошибку, а unsigned int - нет?

По какой-то причине, когда я определяю переменную как «uint» вместо «unsigned int» в своей программе, возникают ошибки. Это кажется странным, потому что uint определяется следующим образом:

typedef unsigned int uint;

... поэтому я думаю, что могу использовать их как взаимозаменяемые. Чтобы быть более точным, я присваиваю результат функции, которая возвращает "unsigned int" в переменную uint, затем использую этот uint в вызове изменения размера вектора... и в этот момент возникают ошибки. То есть мой код выглядит примерно так:

unsigned int getUInt()
{
    return 3;
}

int main(void) {
    vector<vector<float> > vectVect(100000);
    for(uint i = 0; i < vectVect.size(); ++i)
    {
        vector<float>& myVect = vectVect[i];
        uint myUnsignedInt = getUInt();
        myVect.resize(myUnsignedInt);
    }
    cout << "finished" << endl;
}

... и строка, в которой он ошибается, - это строка myVect.resize.

Очевидно, у меня уже есть решение, но я хотел бы понять, ПОЧЕМУ это происходит, так как я довольно озадачен. У кого-нибудь есть идеи?

PS - Если кто-то считает, что это имеет значение, я использую gcc v4.1.2 на Fedora 15... и включаемый файл, определяющий uint, находится в /usr/include/sys/types.h.


person Paul Molodowitch    schedule 17.11.2011    source источник
comment
Всякий раз, когда вы получаете сообщение об ошибке, вам всегда нужно включать рассматриваемую ошибку в свой вопрос.   -  person Seth Carnegie    schedule 17.11.2011
comment
Вы должны показать реальный код, который терпит неудачу. В частности, объявления #include, объявления using и т. д. И GCC 4.6, вероятно, гораздо более соответствует стандарту, чем 4.1.   -  person Basile Starynkevitch    schedule 17.11.2011
comment
И как вы можете видеть здесь, ошибка не возникает в приведенном вами примере (по крайней мере, с эта версия gcc).   -  person Seth Carnegie    schedule 17.11.2011
comment
И, черт возьми, gcc 4.3.4 тоже не выдает ошибку.   -  person Matthieu M.    schedule 17.11.2011
comment
Ошибка была segfault во время выполнения - и после дальнейшего копания я думаю, что typedef не имеет отношения. Должно быть, это какая-то проблема с перезаписью нераспределенной памяти, и изменение этого typedef просто изменило код каким-то случайным образом, чтобы он работал. Тем не менее, спасибо за отзыв!   -  person Paul Molodowitch    schedule 18.11.2011
comment
Это может иметь какое-то отношение к этому. gcc.gnu.org/bugzilla/show_bug.cgi?id=59945   -  person Anže    schedule 28.10.2019
comment
Хм, вполне может быть!   -  person Paul Molodowitch    schedule 07.02.2020


Ответы (2)


Я предполагаю, что в системе есть еще один uint. Попробуйте переименовать свой во что-то необычное или, что еще лучше, оберните его в пространство имен.

namespace MY {
    typedef unsigned int uint;
}

for (MY::uint i = 0; ....
person Ant    schedule 22.12.2011
comment
просто собираюсь выбрать это как ответ, так как это было хорошее предположение, и я так и не понял, что именно происходит ... - person Paul Molodowitch; 13.12.2012

Я предполагаю, что он пытается сформировать своего рода «иерархию».

Другими словами, мы имеем:

typedef unsigned int size_t;
typedef unsigned int uint;

Если size_t является «более конкретным», чем общий unsigned int, то имеет смысл предотвратить его преобразование в uint, который может быть «более конкретным», чем любой старый unsigned int.

Я ожидаю, что это будет предупреждение, если что, а не ошибка...

person user541686    schedule 17.11.2011
comment
Я не думаю, что это все. typedef создает псевдоним для типа, а не новый тип. Таким образом, учитывая приведенные выше объявления, unsigned int, size_t и uint относятся к одному типу (как и unsigned и int unsigned). - person Keith Thompson; 17.11.2011
comment
@KeithThompson: Вот что должно произойти, я согласен; Я предполагаю, что компилятор случайно сделал это вместо этого, но idk. - person user541686; 17.11.2011