下面的c++程序没有编译,并且显示了各种错误
the following c++ program does not compile and is displaying a variety of errors
所以我读到了关于auto和其他C++11标准特性的文章,并制作了这个程序:
#include<iostream>
#include<tuple>
using namespace std;
template<typename T1, typename T2>
auto create_pair(const T1 &a, const T2 &b)
{
pair<T1, T2> p(a, b);
return p;
}
int main()
{
auto p1 = create_pair(4, 5.6);
pair<int, float> p(p1);
cout << get<0>(p);
cout << endl;
cout << get<1>(p);
return 0;
}
我的问题是,auto
是否可以按照create_pair()
函数中规定的方式使用,或者是否存在其他变通方法来实现相同的结果。
使用gcc编译时的错误消息如下:
create_pair函数使用不带返回类型的自动类型说明符。
自动返回类型推导是C++14的一个特性,如果使用C++14编译,您的代码就会工作。返回类型位置中的auto
关键字是C++11尾部返回类型功能的一部分,在该功能中,您可以在正文前面用箭头和类型(例如auto foo() -> int {...}
)指定返回类型。
如果没有宏,在C++11中,最接近的是一个以单个语句(返回语句)为主体的lambda函数,这在模板中不起作用,并且可能会导致函数作为变量而不是函数的轻微问题。
使用宏,您可以获得auto foo() RETURNS(2)
的效果,它将扩展到auto foo() -> decltype(2) {return 2;}
顺便说一句,这个功能已经存在;它是std::make_pair
,它的实现比您的版本更有用。
错误消息完全描述了发生了什么。在C++11中,auto代替函数返回类型不是返回类型推导,而是实际指定返回类型的一种替代方法,应该这样使用:
template<typename T1, typename T2>
auto create_pair(const T1 &a, const T2 &b) -> std::pair<T1, T2>;
它旨在用于等环境
template <typename T1, typename T2>
auto add (T1 const & x1, T1 const & x2) -> decltype(x1 + x2)
{
return x1 + x2;
}
而不是更丑陋的
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>()) add (T1 const & x1, T1 const & x2)
{
return x1 + x2;
}
在C++11中,返回类型扣除仅适用于lambdas:
auto create_pair = [](int x, int y){ return std::pair<int, int>(x, y); }
由于您的函数是一个模板(允许模板化的通用lambda也是C++14的特性),所以这不会有多大帮助。
然而,您的代码应该在C++14下编译,因为后者带来了与您在代码中使用的语法完全相同的返回类型推导。
相关文章:
- 显示错误输出的简单数组排序程序
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- Clion显示错误,但可以使用Cmake成功构建代码
- 代码使用向量成功运行,但使用数组显示错误
- SDL 映像:无法打开映像,仅显示错误消息
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- PPM 颜色显示错误
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- is_permutation方法从 #include<algorithm> 显示错误的输出
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 我的代码厨师提交显示错误的结果
- 显示错误"std_lib_facilities.h"
- 为什么C++显示错误的数字?
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- c++ IF 语句执行,但添加 ELSE 会显示错误
- 内核.cpp在制作 kernel.o 时显示错误和 Makefile 错误
- C++代码编译,但在 Zorin OS 上运行时显示错误