views:

192

answers:

4

In msvc, I have functions like this and it builds but in gcc it doesnt like it.

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

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

The issue here is in the &, gcc I think is worried that since I just created that std::string, that passing by reference is risky, so it does not build, but msvc doesnt even warn me.

Why is this incorrect c++ to gcc I keep hearing that msvc is stricter than gcc.

Thanks

The error

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

would this be okay?

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

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

I have no idea why Visual studio allows you to compile this, but you can't pass a reference to an anonymous object.

Edit: Its ok for const reference, cause you can pass the temporary object as reference, just being able to modify it doesn't make sense. That's why we have rvalue references in C++0x.

Edit2: To your edit, yes that would fix the problem, or just take a const reference as parameter in the a() method, you don't seem to modify the parameter.

Let_Me_Be
Oh, you should see some of the other stuff msvc lets me do :p
Milo
vanza
+5  A: 

I think this is an old compiler extension that Visual Studio supported since way back then, but it is kept around in modern Visual C++ for compatibility. Try disabling compiler extensions (/Za flag) and see what happens.

Alternatively, use the /W4 flag to get maximum warnings, and it should complain:

warning C4239: nonstandard extension used

On GCC I get the const reference error:

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

birryree
A: 

Without the actual error message I can only guess: class is a reserved keyword and you should name your class differently, this is not a valid method definition:

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

EDIT: the problem is in passing the anonymous reference, as others have pointed out. You can just ignore this answer now.

dark_charlie
+2  A: 

I believe someone else said this first, but passing a reference to an anonymous object is illegal. Visual C++ is weird. To fix it, try something like this:

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

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

BTW, I assume your class name is not actually 'class', and you're just using that as a placeholder, because

class class {
    // ...
};

stuff is illegal.

alpha123