免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 35220 | 回复: 25
打印 上一主题 下一主题

[C++] 奇怪的构造函数的问题(no matching function for call ),请关注 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-01 16:12 |只看该作者 |倒序浏览
一段很普通的代码:
#include <iostream>
using namespace std;
class Example
{
public:
    Example()
    {

    }
    Example(char *name,char *address)
    {
        cout<<"loading construct"<<endl;
        strcpy(Example::name,name);
    }
    
    Example(Example &temp)
    {
        cout<<"loading copy construct"<<endl;
        strcpy(Example::name,temp.name);
        cin.get();
    }
    ~Example()
    {
        cout<<"loading Destruct";
        cin.get();
    }
 
protected:
    char name[20];
    char address[20];
};

   Example tp()
{
    Example b("China","USA");
    return b;
}
int main()
{
    Example a;
    a = tp();
    return 0;
}


G++出错:
main.cpp:47: error: no matching function for call to `Example::Example(Example)'
main.cpp:24: note: candidates are: Example::Example(Example&)

VC 不出错

我search了这个问题,没有什么信服的解释,只有个人帖子其中提到不要再return语言中使用构造函数,我不得其解。

[ 本帖最后由 smartvessel 于 2009-12-1 16:14 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-12-01 16:23 |只看该作者
Example(Example &temp); // 非常量引用
a = tp(); // 只能绑定到左值。函数调用返回的临时对象是右值。

在这点上,msvc是不符合标准的,g++是正确的。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2009-12-01 16:25 |只看该作者
除了Example(Example &temp)比较奇怪外,没看出其他什么
Example(const Example& temp)

论坛徽章:
0
4 [报告]
发表于 2009-12-01 16:37 |只看该作者
原帖由 OwnWaterloo 于 2009-12-1 16:23 发表
Example(Example &temp); // 非常量引用
a = tp(); // 只能绑定到左值。函数调用返回的临时对象是右值。

在这点上,msvc是不符合标准的,g++是正确的。


非常量引用在语法上应该是走的过去的吧
另外“绑定左值”能不能在具体点解释一下,thanks

论坛徽章:
0
5 [报告]
发表于 2009-12-01 16:39 |只看该作者
原帖由 bruceteen 于 2009-12-1 16:25 发表
除了Example(Example &temp)比较奇怪外,没看出其他什么
Example(const Example& temp)


如你所说,的确加上const,是正确的了。
但是,为什么呢?

论坛徽章:
0
6 [报告]
发表于 2009-12-01 16:59 |只看该作者
临时对象的关系吧,可以查查C++编程思想中关于临时对象的说明。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2009-12-01 17:01 |只看该作者

回复 #4 smartvessel 的帖子

T makeT();

void use_by_const_ref(T const& v);
void use_by_non_const_ref( T& );

void f()
{
        T a_lvalue;
        use_by_const_ref(a_lvalue); // ok
        use_by_non_const_ref(a_lvalue); // ok

        use_by_const_ref( makeT() ); // ok
        use_by_non_const_ref( makeT() ); // error
}

论坛徽章:
0
8 [报告]
发表于 2009-12-01 17:20 |只看该作者

回复 #7 OwnWaterloo 的帖子

makeT() 所产生的临时对象,在函数调用结束,已经被删除。

使用const引用,这样临时对象在其引用离开作用域时才销毁(例子中的作用域就是use_by_const_ref函数体内)



thanks

论坛徽章:
0
9 [报告]
发表于 2009-12-01 17:23 |只看该作者
原帖由 cu_chandler 于 2009-12-1 16:59 发表
临时对象的关系吧,可以查查C++编程思想中关于临时对象的说明。


谢谢,我手头有本C++程序设计语言特别版

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2009-12-01 17:40 |只看该作者

回复 #8 smartvessel 的帖子

对,因为const引用可以绑定到临时对象,并提升临时对象的生命周期。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP