2010-10-09 2 views
3

В msvc у меня есть такие функции, и он строит, но в gcc ему это не нравится.Почему msvc позволяет мне это делать, но не gcc/g ++?

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

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

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

Почему этот неправильный C++ для 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); 
} 
+0

Нужно больше контекста. Какая ошибка вы получаете, что такое «stdStringFromClass» и т. Д. – vanza

+0

stdStringFromClass является std :: string – jmasterx

+0

MSVC не является более строгим, чем gcc, что кажется мне довольно обратным. Ошибка заключается в том, что временное не может быть привязано к неконстантной ссылке. Однако сложно сказать вам решение, когда вы указали очень маленький код. Вам нужно изменить параметр? Если нет, сделайте это константой-ссылкой. В чем смысл перегрузки 'char *' (должна быть 'const char *') вместе с перегрузкой 'std :: string'? 'std :: string' может быть неявно построена из' const char * '. – GManNickG

ответ

3

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

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

Редактировать2: Для редактирования, да, это устранит проблему или просто возьмет константу ссылки как параметр в методе a(), вы, похоже, не изменяете параметр.

+0

О, вы должны увидеть некоторые другие вещи, которые позволяет msvc: p – jmasterx

+0

. Ошибка, которую я получаю с некоторыми предположениями: «str.cpp: 11: ошибка: недействительная инициализация неконстантной ссылки типа« std :: string & »из временного типа« std :: string »» – vanza

6

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

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

warning C4239: nonstandard extension used

На НКУ я получаю константную ссылку ошибку:

error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’

0

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

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

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

3

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

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

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

BTW, я полагаю, ваше имя класса на самом деле не «класс», и вы используете только, что в качестве заполнителя, потому что

class class { 
    // ... 
}; 

материал является незаконным.

Смежные вопросы