Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Забавный случай 
:(
    Опции темы
fear
Дата 7.6.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



компилятор выдаёт ошибку в строке
Код

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);



Это как называется? 
PM MAIL   Вверх
Daevaorn
Дата 7.6.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



fear, он же тебе всё объяснил. ambiguous call это называется 
PM MAIL WWW   Вверх
Earnest
Дата 7.6.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
sergejzr
Дата 7.6.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Модератор: Название темы должно отражать ее суть! 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
fear
Дата 8.6.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата(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 и инициализирует, созданный объект нулём, или я не прав? 
PM MAIL   Вверх
LPBOY
Дата 8.6.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



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

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

#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-й функции будет иметь место точное соответствие, что лучше чем любое преобразование, поэтому она и будет выбрана. 
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.