标题:大括号调用有参构造函数问题,求解。
只看楼主
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
结帖率:87.5%
已结贴  问题点数:5 回复次数:7 
大括号调用有参构造函数问题,求解。
最近看一个微软的一个研究团队工程代码,我看到一段代码感觉有问题。
项目中定义了类 pipeline,其中只定义了有参构造函数pipelie
Pipeline(const CameraParameters _camera_parameters,
                 const GlobalConfiguration _configuration);

但为什么创建类对象的时候使用大括号包含参数呢?
Pipeline pk{ camera->get_parameters(), configuration };

既然是有参构造,不应该是用小括号构造吗?
Pipeline pk( camera->get_parameters(), configuration );

我利用代码测试,如果用大括号包含参数会提示找不到对应的构造函数。但人家论文给出了效果,开源了代码,似乎不应该有错。请大牛指点一下。难道是以前的c++标准可以这样做?谢谢
搜索更多相关主题的帖子: 构造 括号 调用 代码 构造函数 
2021-12-22 23:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
这叫统一初始化(Uniform Initialization),我猜你使用的编译器比较老旧,起码有十多年没更新过了

程序代码:
struct foo
{
    foo() {}
    foo( int, int ) {}

    int value{ 123 };
};

int main( void )
{
    foo a {};
    foo b { 1, 2 };
    foo c = {};
    foo d = { 1, 2 };
}


2021-12-23 08:21
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
得分:0 
回复 2楼 rjsp
您好,那您的意思是人家代码是正确的,我的编译器比较老吗?
我用的是visual studio 2019,编译器应该是其自带的,我查看了有个MSVC 14.2的。
我刚才网页上点击运行您写的代码,也有如下提示和错误
程序代码:
6:20: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
     int value{ 123 };
                    ^
6:14: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     int value{ 123 };
              ^
6:20: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     int value{ 123 };
                    ^

 In function ‘int main()’:
11:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     foo a {};
           ^
11:12: error: in C++98 ‘a’ must be initialized by constructor, not by ‘{...}’
     foo a {};
            ^
12:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     foo b { 1, 2 };
           ^
12:18: error: in C++98 ‘b’ must be initialized by constructor, not by ‘{...}’
     foo b { 1, 2 };
                  ^
13:14: error: in C++98 ‘c’ must be initialized by constructor, not by ‘{...}’
     foo c = {};
              ^
14:20: error: in C++98 ‘d’ must be initialized by constructor, not by ‘{...}’
     foo d = { 1, 2 };
2021-12-23 09:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
当然!

在你的VS2019中,打开你的这个工程
按 ALT+F7(我不知道使用的快捷键是不是这个)
配置属性\常规\C++语言标准,选择 /std:c++ latest(最起码也要选一个十年前的C++11)
2021-12-23 11:31
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
得分:0 
回复 4楼 rjsp
好的,非常感谢。刚才调整后确实可以。
经比较,我自己创建的vs项目就有那个debug properties这个选项,可以调节编译器的版本。
而直接下载的别人的项目一般没有vs项目,就是包含一些头文件或者源文件,也就没有这个debug properties这个选项(人家的项目很多是在linux下跑的,可能属于cmake工程文件)。
所以请问:如果想编写在linux下运行的代码,但我先在windows下VS中编写行不行呢?移植到linux一般要注意什么呢?也得弄cmake工程才行吗?谢谢
2021-12-23 12:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
取决于你编译代码使用的编译器,不同的编译器使用不同的编译参数

g++和clang++,编译参数形如 -std=c++2b,如果你的编译器比较老旧,可以依次试试 -std=c++17、-std=c++14、-std=c++11
vc++,编译参数形如 /std=c++latest、/std=c++20、/std=c++17、/std=c++14、/std=c++11

编译参数加到 makefile 文件中,自己找找,因为makefile格式比较灵活,别人也说不出一定会写在哪里。

如果想编写在linux下运行的代码,但我先在windows下VS中编写行不行呢?
行,只要你不使用 非标准 的东西。C/C++是源代码级跨平台的。

移植到linux一般要注意什么呢?
只要你使用的是 标准 的东西,那什么都不需要注意。
当然,这很难,因为
a. 某些语法或特性或库 在C/C++标准中是“可选的”,也就是在一个编译器支持,在另一个编译器中可能不支持。比如 scanf_s 等傻逼函数
b. 某些规定是实现定义的,比如 char 是否具有符号位,比如 wchar_t 占几个字节,比如 short、int、long 等等占几个字节,比如 聚合对象的对齐规格,等等
c. 操作系统方面的差异,比如路径间隔符实用 斜杠 还是 反斜杠,比如换行是 \n,还是 \r\n
……

也得弄cmake工程才行吗?
随便你呀,如果你有兴致,命令行编译链接都行。


2021-12-23 12:38
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
得分:0 
回复 6楼 rjsp
谢谢版主,非常感谢普及知识。
2021-12-23 13:29
magicwater
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-12-26
得分:0 
回复 3楼 wolfcan
谢谢分享
2021-12-26 19:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507962-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.237392 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved