1

我在试图弄清楚以下两行的含义时遇到了阻塞问题。以下是 gsoap 声明的方法声明,我对如何定义 finstion 的参数感到困惑

SOAP_FMAC3 void SOAP_FMAC4 **soap_serialize_PointerTomss__MobileUserType**(struct soap *soap, mss__MobileUserType *const*a)

所以我正在尝试关注但无法弄清楚这里的错误是什么。

 mss__MobileUserType const *mobile_user_type = setupMobileUsertype();  
**soap_serialize_PointerTomss__MobileUserType**(soap , &mobile_user_type);

我在这里做错了什么。

4

4 回答 4

5
Type *const* a;

a是一个pointer到一个const pointerType

C++const限定符适用于它的左边,如果左边有东西,否则它适用于右边的东西

为了简单起见,请考虑这一点。

int a;
int* const p = &a;    // (1)
int** pp = &p;        // (2)   This is not possible since `p` is `const` pointer.
int* const *ppc = &p; // (3)   This is your case.

mss__MobileUserType* const mobile_user_type = setupMobileUsertype();  // (1)
mss__MobileUserType* const *mobile_user_type_p = &mobile_user_type;   // (3)

soap_serialize_PointerTomss__MobileUserType(soap , mobile_user_type_p);

阅读这里这里了解更多关于 const 正确性的信息。

于 2013-05-01T16:29:51.130 回答
1

您正在调用的函数需要一个指向 (non-const) 的 const 指针mss__MobileUserType。该表达式 &mobile_user_type是指向 const 的(非常量)指针的指针 mss__MobileUserType。两者之间没有隐式转换。(有一个指向 const 的指针指向非 const 的指针也很奇怪,但我不知道库,所以也许是有原因的。符号带有两个连续的下划线也是未定义的行为。)

于 2013-05-01T16:32:39.207 回答
0

假设您的声明是这样的:

SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTomss__MobileUserType(struct soap *soap, mss__MobileUserType *const *a);

然后你需要传递一个 const 指针的地址:

mss__MobileUserType *const mobile_user_type = setupMobileUsertype();  
soap_serialize_PointerTomss__MobileUserType(soap , &mobile_user_type);
于 2013-05-01T16:32:31.453 回答
0

声明可以以可能有 cv 限定的类型说明符开头,例如:

X
const X
X const

然后可以跟随零个更多的 ptr 声明符,例如:

*
* const

每个都指定一个指向前一个类型的指针。ptr-declarator 中的 const 适用于指针,而不适用于类型:

例如:

const X*
X const*
X* const
X const * const
X const **const***

让我们分解:

const X ** const*

这是:

const X - const X
*       - pointer to previous
* const - const pointer to previous
*       - pointer to previous

所以它是一个“指向 const 指针的指针,指向 const X 的指针”

于 2013-05-01T16:38:25.760 回答