Почему msvc позволяет мне это делать, а не gcc / g ++? - PullRequest
3 голосов
/ 10 октября 2010

В msvc у меня есть такие функции, и он собирается, но в gcc это не нравится.

void classname::a(std::string &text)
{
    stdStringFromClass = text;
}

void classname::b(char *text)
{
    a(std::string(text));
}

Проблема здесь в &, gcc, я думаю, беспокоюсь, что, так как я только что создал этоstd :: string, что передача по ссылке рискованна, поэтому она не собирается, но msvc даже не предупреждает меня.

Почему это неверный c ++ to gcc? Я продолжаю слышать, что msvc строже gcc.

Спасибо

Ошибка

AguiWidgetBase.cpp: In member function ‘void AguiWidgetBase::setText(char*)’:
AguiWidgetBase.cpp:91:27: error: no matching function for call to ‘AguiWidgetBase::setText(std::string)’
AguiWidgetBase.cpp:80:6: note: candidates are: void AguiWidgetBase::setText(std::string&)
AguiWidgetBase.cpp:88:6: note:                 void AguiWidgetBase::setText(char*)

это будет хорошо?

void classname::a(std::string &text)
{
    stdStringFromClass = text;
}

void classname::b(char *text)
{
   std::string k = text;
    a(k);
}

Ответы [ 4 ]

6 голосов
/ 10 октября 2010

Я думаю, что это старое расширение компилятора, которое Visual Studio поддерживало с тех пор, но оно сохраняется в современном Visual C ++ для совместимости. Попробуйте отключить расширения компилятора (флаг /Za) и посмотрите, что произойдет.

В качестве альтернативы, используйте флаг /W4, чтобы получить максимальное количество предупреждений, и он должен жаловаться:

предупреждение C4239: используется нестандартное расширение

В GCC я получаю ошибку константы:

ошибка: неверная инициализация неконстантной ссылки типа ofstd :: string & ’из временного типа ofstd :: string’

3 голосов
/ 10 октября 2010

Я считаю, что кто-то еще сказал это первым, но передача ссылки на анонимный объект является незаконной. Visual C ++ странный. Чтобы это исправить, попробуйте что-то вроде этого:

void class::a(const std::string &text)
{
    stdStringFromClass = text;
}

void class::b(const char *text)
{
    a(std::string(text));
}

Кстати, я предполагаю, что ваше имя класса на самом деле не 'class', и вы просто используете его как заполнитель, потому что

class class {
    // ...
};

материал незаконен.

3 голосов
/ 10 октября 2010

Я понятия не имею, почему Visual Studio позволяет вам скомпилировать это, но вы не можете передать ссылку на анонимный объект.

Редактировать: все в порядке для константной ссылки, потому что вы можете передать временный объект как ссылку, просто возможность изменить его не имеет смысла. Вот почему у нас есть ссылки на значения в C ++ 0x.

Edit2: Если вы хотите отредактировать, да, это решит проблему или просто примете константную ссылку в качестве параметра в методе a(), вы, похоже, не изменили параметр.

0 голосов
/ 10 октября 2010

Без фактического сообщения об ошибке я могу только догадываться: class является зарезервированным ключевым словом, и вы должны назвать свой класс по-другому, это недопустимое определение метода:

void class::a(std::string &text) { ... }

EDIT: проблема в передачеанонимная ссылка, как указали другие.Вы можете просто проигнорировать этот ответ сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...