为什么msvc让我这样做而不是gcc / g ++?

时间:2010-10-09 20:13:28

标签: c++ visual-c++ gcc

在msvc中,我有这样的函数并且它构建但是在gcc中它不喜欢它。

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

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

这里的问题出在&,gcc我觉得很担心,因为我刚创建了那个std :: string,通过引用传递是有风险的,所以它不构建,但是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);
}

4 个答案:

答案 0 :(得分:6)

我认为这是Visual Studio当时支持的旧编译器扩展,但它在现代Visual C ++中保留了兼容性。尝试禁用编译器扩展(/Za标志)并查看会发生什么。

或者,使用/W4标志获取最大警告,它应该抱怨:

  

警告C4239:使用非标准扩展名

在GCC上我得到const引用错误:

  

错误:从'std :: string'类型的临时表中初始化'std :: string&'类型的非const引用

答案 1 :(得分:3)

我不知道为什么Visual Studio允许你编译它,但你不能传递对匿名对象的引用。

编辑:它可以用于const引用,因为你可以传递临时对象作为参考,只是能够修改它没有意义。这就是为什么我们在C ++ 0x中有rvalue引用。

Edit2:对于你的编辑,肯定会解决问题,或者只是在a()方法中将const引用作为参数,你似乎没有修改参数。

答案 2 :(得分:3)

我相信其他人首先说过这个,但是传递对匿名对象的引用是非法的。 Visual C ++很奇怪。要修复它,请尝试以下方法:

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

void class::b(const char *text)
{
    a(std::string(text));
}
顺便说一句,我认为你的班级名称实际上并不是“班级”,而你只是将其用作占位符,因为

class class {
    // ...
};

东西是非法的。

答案 3 :(得分:0)

如果没有实际的错误消息,我只能猜测:class是一个保留关键字,您应该以不同的方式命名您的类,这不是一个有效的方法定义:

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

编辑:问题在于传递匿名引用,正如其他人指出的那样。你现在可以忽略这个答案。