Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Забавный случай


Автор: fear 7.6.2006, 13:13
компилятор выдаёт ошибку в строке
Код

str += unsigned char(0);

где str - std::string

пишет:
Код

Compiling...
messageframe.cpp
.\messageframe.cpp(55) : error C2593: 'operator +=' is ambiguous
        D:\Lang\Microsoft Visual Studio 8\VC\include\xstring(900): could be 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator +=(_Elem)'
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Ax=std::allocator<char>
        ]
        D:\Lang\Microsoft Visual Studio 8\VC\include\xstring(895): or 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator +=(const _Elem *)'
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Ax=std::allocator<char>
        ]
        while trying to match the argument list '(std::string, unsigned char)'



ошибка проподает, при компиляции сторок
Код

str += char(0);

или
Код

str += unsigned char(1);



Это как называется? 

Автор: Daevaorn 7.6.2006, 13:33
fear, он же тебе всё объяснил. ambiguous call это называется 

Автор: Earnest 7.6.2006, 13:48
Поскольку правый операнд не является char (и при этом равен 0), он может с равным успехом преобразоваться как к указателю, так и к char. Вот тебе и неоднозначность.
Когда ты пишешь unsigned char(1), то к указателю это преобразовать нельзя, вот и остается только один вариант. 

Автор: sergejzr 7.6.2006, 14:30
Модератор: Название темы должно отражать ее суть! 

Автор: fear 8.6.2006, 11:13
Цитата(sergej.z @ 7.6.2006,  14:30)
Модератор: Название темы должно отражать ее суть!

больше не буду

Добавлено @ 11:14 
Цитата(Earnest @ 7.6.2006,  13:48)
Поскольку правый операнд не является char (и при этом равен 0), он может с равным успехом преобразоваться как к указателю, так и к char. Вот тебе и неоднозначность.
Когда ты пишешь unsigned char(1), то к указателю это преобразовать нельзя, вот и остается только один вариант.

Как это может преобразоваться к указателю, в моём понимании unsigned char(0) вызывает конструктор класса unsigned char и инициализирует, созданный объект нулём, или я не прав? 

Автор: LPBOY 8.6.2006, 11:41
Во-первых у встроенных типов нет конструкторов, не слушай ты этих Элджеров...

Можно привести аналогичный пример:
Код

#include <iostream>

void f(char i) // 1
{
    std::cout << "integer\n";
}

void f(char* p) // 2
{
    std::cout << "pointer\n";
}

int main()
{
    const unsigned char uc = 0;
    f(uc);
}

Здесь происходит разрешение перегрузки. Выбирается функция, которая лучше всего подходит.
При вызове функции 1, должно произойти преобразование (integral conversion) unsigned char -> char,
а при вызове 2-й функции преобразование "null pointer constant" -> char*. Оба вида преобразований имеют одинаковый ранг, поэтому возникает неоднозначность.
Если передавать в функйию не unsigned char, а просто char, то при вызове 1-й функции будет иметь место точное соответствие, что лучше чем любое преобразование, поэтому она и будет выбрана. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)