gpt4 book ai didi

C++ 无法将成对的指针初始化为 NULL

转载 作者:可可西里 更新时间:2023-11-01 18:17:18 29 4
gpt4 key购买 nike

我正在用 g++ 4.4.7 编译(目前不能再高了),并使用 -std=gnu++0x 编译器开关,它应该允许语法第三行。

typedef std::vector<CI_RecordInfo_Pair>   CI_RecordInfo_Vector;
typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks;
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; // <--- line 59

但是,编译器报错如下:

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h: In constructor 'std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[9], _U2 = long int, _T1 = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = CI_RecordInfo_Vector*]':
tom.cpp:59: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:90: error: invalid conversion from 'long int' to 'CI_RecordInfo_Vector*'

我假设“long int”是 NULL,并且出于某种原因我无法将它转换为指针。然而在结构映射的其他地方,我能够编译类似的东西

foo["X"] = { NULL, "bar", 12 }; // first element is a pointer

有什么区别?

最佳答案

编译器拒绝这一行是正确的:

MgrBlks mgr_n_blks { {"T2M_NAME", NULL} };

在 C++11 中,std::pair 有一个模板构造函数,它接受任何参数类型,然后将它们转换为成员:

template<typename X, typename Y>
pair(X&& x, Y&& y)
: first(std::forward<X>(x)), second(std::forward<Y>(y))
{ }

NULL 必须定义为 00L 或类似的东西,因此模板参数推导将构造函数的模板参数推导为 const char* 和(使用 GCC)long。第一个参数类型可转换为 std::stringlong 不可转换为 CI_RecordInfo_Vector*,因此无法调用构造函数。

对于结构映射的另一种情况,没有参数推导,赋值的 RHS 必须可转换为结构类型,在这种情况下,NULL 用于直接初始化结构的first 成员,而不是首先被推导为 long 并初始化一个 long,它不能转换为指针。

不要在 C++11 中使用 NULLnullptr 正是为了避免这些问题而发明的,您应该使用它。

一个可能的解决方法是将参数转换为正确的类型:

MgrBlks mgr_n_blks { {"T2M_NAME", (CI_RecordInfo_Vector*)NULL} };

但是使用nullptr会更简单明了。

关于C++ 无法将成对的指针初始化为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217221/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com