VS2013对C++新特性的支持不够,在编译CloudCompare时会报各种错误。现将遇到的问题及解决方法跟大家分享下。
①
error C2440: “初始化”: 无法从“initializer-list”转换为“QList<QChar>”
这个是VS2013对
initializer-list还不支持。
initializer-list指的是C++11中的一个新特性,允许构造自定义对象数组时,使用像普通数组一样的初始化方法。
简单举例,比如int a[] = {1,2,3,4};这个编译器都支持;但对于Person persons[] = {new Person(), new Person()},旧的编译器已经不支持了。
在编译过程中发现只有一个地方报了这个错,是在CCViewer里边。因此就顺手改了吧,
② 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(357,5): warning MSB8004: Output Directory does not end with a trailing slash. This build instance will add the slash as it is required to allow proper evaluation of the Output Directory.
1> ccviewer.cpp
1>D:\CloudCompare-master\CloudCompare-master\plugins\ccIOFilterPluginInterface.h(54): error C2440: “<function-style-cast>”: 无法从“initializer-list”转换为“QVector<FileIOFilter::Shared>”
1> 无构造函数可以接受源类型,或构造函数重载决策不明确
1> ccPluginManager.cpp
1>D:\CloudCompare-master\CloudCompare-master\plugins\ccIOFilterPluginInterface.h(54): error C2440: “<function-style-cast>”: 无法从“initializer-list”转换为“QVector<FileIOFilter::Shared>”
1> 无构造函数可以接受源类型,或构造函数重载决策不明确
这个错误是VS2013对lambda表达式不支持导致的,错误位置在ccIOFilterPluginInterface.h中,修改方法是:
修改方法是:
③ 1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(264): error C2332: “struct”: 缺少标记名
1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(264): error C2226: 语法错误 : 意外的“ccPluginManager::loadFromPathsAndAddToList::<unnamed-tag>”类型
1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(267): error C2332: “struct”: 缺少标记名
1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(267): error C2144: 语法错误:“ccPluginManager::loadFromPathsAndAddToList::<unnamed-tag>”的前面应有“)”
1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(267): error C2660: “QVector<ccPluginInterface *>::indexOf”: 函数不接受 0 个参数
1>..\..\CloudCompare-master\qCC\pluginManager\ccPluginManager.cpp(267): error C2059: 语法错误:“)”
这个错误有一大堆,找了半天,却发现原因在于对interface这个变量的使用上,可能对于VS2013,interface是个关键字,把它当做变量出了问题。只用将interface这个变量修改为interface0,就没问题了。当然,你也可以将它改成其他名称。