运算符重载会在Visual Studio 2013中编译,但不会在gcc中编译

查理帕克

我有一个这样的类,其中我像这样重载了<<和+运算符:

    friend MyObject operator+(MyObject lhs, MyObject rhs){
        MyObject obj;
        obj.Property = lhs.Property + rhs.Property;
        return obj;
    }

    friend std::ostream& operator<<(std::ostream& os, MyObject& n) {
        os << MyObject.Property;      //property is a double
        return os;
    }

可以在Visual Studio和gnu ++ 98中编译,没有任何问题。我也可以这样称呼他们,没有任何问题:

MyObject obj1, obj2;
obj1.PutInValidState();
cout << obj1;
obj1 = obj1 + obj2;

但是,当我像这样同时调用它们时:

cout << obj1 + obj2;

Visual Studio将编译它(并提供正确的输出),但是gnu ++ 98给我错误“ std :: operator <<(std :: basic_ostream&,const char *)中的'operator <<'不匹配” 。我可以通过在函数定义中的参数上添加const来将其编译成两种形式:

friend std::ostream& operator<<(std::ostream& os, const MyObject& n) {

这里发生了什么?为什么我需要const才能使其在gnu ++ 98中工作,而在Visual Studio中却不工作呢?

布马特
cout << obj1 + obj2;

是语法糖

operator<<(cout, operator+(obj1,obj2));

在这里,您可以看到noperator <<()重载中的参数已绑定到operator +()返回的值,该值是一个临时对象。现在,在C ++中,有一个规则,即非const引用参数不能绑定到临时变量,这就是为什么它不能在gcc中编译的原因。

另一方面,Visual Studio具有语言扩展,该语言扩展允许将非const引用参数绑定到临时变量。我希望它不会,因为该扩展是在将代码移植到其他编译器时使我难过的扩展之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++相同的代码永远不会在Visual Studio中编译/运行,有时甚至不会在Qt Creator中运行

来自分类Dev

C ++:类型转换运算符重载-Visual Studio 2013内部错误

来自分类Dev

项目会编译,但不会在编译器中显示信息

来自分类Dev

Android Studio不会在IDE中解析以Kotlin(.kt)编写的类,但可以正常编译

来自分类Dev

Android Studio不会在IDE中解析以Kotlin(.kt)编写的类,但可以正常编译

来自分类Dev

在Visual Studio 10中使用类型转换运算符重载时发生C2440错误

来自分类Dev

CMAKE不会在Visual Studio中创建INSTALL项目

来自分类Dev

程序可以编译,运行,但不会在DevC ++中结束

来自分类Dev

重载运算符的参数太多,Visual Studio C ++

来自分类Dev

重载运算符的参数太多,Visual Studio C ++

来自分类Dev

Visual Studio 2013-自动插入“->”运算符

来自分类Dev

Premake生成的解决方案不会在Release中编译,但会在Debug中编译

来自分类Dev

SCSS @include mixin不会在Rails中编译

来自分类Dev

Proguard不会在Android Studio中混淆

来自分类Dev

Android Studio 不会在 PasswordToggleDrawable 中更改颜色

来自分类Dev

在Visual Studio 2013中编译NTL库

来自分类Dev

使用g ++编译器在Visual Studio中编译C ++程序会在最后生成%

来自分类Dev

解决方案探索中的区域选项不会在Visual Studio 2019中显示

来自分类Dev

SyncFusion SfChart 不会在 iOS 模拟器(白屏)中呈现,但会在 Visual Studio Preview 中显示?

来自分类Dev

更新ParameterSyntaxList不会在Visual Studio中更新代码吗?

来自分类Dev

异步不会在Visual Studio 2015中调用move构造函数

来自分类Dev

引用不会在 Visual Studio 2005 中自动添加

来自分类Dev

增量运算符++ i不会在python中引起错误

来自分类Dev

Haskell中的全局&&运算符重载无法编译

来自分类Dev

在Visual Studio 2015中的符号扩展操作数上使用按位或运算符

来自分类Dev

Visual Studio 2013不会在错误的代码行上停止

来自分类Dev

C中的赋值运算符重载

来自分类Dev

R中%in%运算符的重载

来自分类Dev

JavaScript中的运算符重载

Related 相关文章

  1. 1

    C ++相同的代码永远不会在Visual Studio中编译/运行,有时甚至不会在Qt Creator中运行

  2. 2

    C ++:类型转换运算符重载-Visual Studio 2013内部错误

  3. 3

    项目会编译,但不会在编译器中显示信息

  4. 4

    Android Studio不会在IDE中解析以Kotlin(.kt)编写的类,但可以正常编译

  5. 5

    Android Studio不会在IDE中解析以Kotlin(.kt)编写的类,但可以正常编译

  6. 6

    在Visual Studio 10中使用类型转换运算符重载时发生C2440错误

  7. 7

    CMAKE不会在Visual Studio中创建INSTALL项目

  8. 8

    程序可以编译,运行,但不会在DevC ++中结束

  9. 9

    重载运算符的参数太多,Visual Studio C ++

  10. 10

    重载运算符的参数太多,Visual Studio C ++

  11. 11

    Visual Studio 2013-自动插入“->”运算符

  12. 12

    Premake生成的解决方案不会在Release中编译,但会在Debug中编译

  13. 13

    SCSS @include mixin不会在Rails中编译

  14. 14

    Proguard不会在Android Studio中混淆

  15. 15

    Android Studio 不会在 PasswordToggleDrawable 中更改颜色

  16. 16

    在Visual Studio 2013中编译NTL库

  17. 17

    使用g ++编译器在Visual Studio中编译C ++程序会在最后生成%

  18. 18

    解决方案探索中的区域选项不会在Visual Studio 2019中显示

  19. 19

    SyncFusion SfChart 不会在 iOS 模拟器(白屏)中呈现,但会在 Visual Studio Preview 中显示?

  20. 20

    更新ParameterSyntaxList不会在Visual Studio中更新代码吗?

  21. 21

    异步不会在Visual Studio 2015中调用move构造函数

  22. 22

    引用不会在 Visual Studio 2005 中自动添加

  23. 23

    增量运算符++ i不会在python中引起错误

  24. 24

    Haskell中的全局&&运算符重载无法编译

  25. 25

    在Visual Studio 2015中的符号扩展操作数上使用按位或运算符

  26. 26

    Visual Studio 2013不会在错误的代码行上停止

  27. 27

    C中的赋值运算符重载

  28. 28

    R中%in%运算符的重载

  29. 29

    JavaScript中的运算符重载

热门标签

归档