auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
auto f = bind(dist<>,gen) fails in C++ member declaration. Not recognized as a function
Stroustrup的"C++编程语言"中的一些示例代码无法使用GCC 6.4.1 std=C11进行编译。
#include <random>
#include <functional>
// From Stroustrup C++11 4th Edition section 40.7
// error: non-static data member declared ‘auto’
class Rand_int {
public: // public: Added to text from original
Rand_int(int lo, int hi) : p{lo,hi} { }
int operator()() const { return r(); }
private:
std::uniform_int_distribution<>::param_type p;
auto r = std::bind(std::uniform_int_distribution<>{p},std::default_random_engine{});
};
编译器失败,并显示"错误:非静态数据成员声明为'auto'"。因此,它将此定义视为数据成员的定义,而不是成员函数的定义。从绑定返回应该允许声明 auto。
Stroustrup 的这句话紧跟在上面的代码之后:"我使用发行版的标准param_type别名 (§40.7.3( 存储参数,以便我可以使用自动,以避免必须命名绑定((的结果。
default_random_engine
是 stdlib 模板函数的typedef
。如何解决?
因此,它将此定义视为数据成员的定义,而不是成员函数的定义。
此方法有几个问题:
-
std::bind()
返回一个"函数对象",又名函子,而不是函数
来自 std::bind 文档:
未指定类型 T 的函数对象,其 std::is_bind_expression::value == true
- 即使你把一个函数放在赋值的右侧,它也不会使它成为一个函数
例如:
void foobar();
auto r = foobar;
这将使r
成为指向类型为 void (*)();
而不是函数的函数foobar()
的指针。无法以这种方式声明方法或独立函数。事实上,在稍后的代码中,您可以像使用r();
函数一样调用它,但这并不能使它成为函数。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败