以下代码无法在'func(& pobj);'行上编译两个错误声明“无法在函数main()中将'X * *'转换为'const X * *'”和“函数main()中的参数1中的类型不匹配(想要'const X * *',得到'X * *') “即使它是传递指针参数的正确方法。而且还评论了这条特殊的线,即'func(& pobj);'并取消注释它上面的两行,它声明了一个新的'const'指针'pp'所需类型(在func的参数中),但仍然在声明并指定'pp'的行上抛出一个错误,说“无法转换'X * *函数main()中的'to'const X * *'。
using X = int;
void func(const X **);
int main() {
X *pobj = new X(58);
// const X **pp = &pobj; // ERROR
// func(pp);
func(&pobj); // ERROR
}
我相信这是将常量指针作为参数传递的正确方法,我只是不明白为什么程序无法编译。任何人都可以指出上面代码中的错误,如果我错了,建议我正确的逻辑/语法?提前致谢。
更新: 这个问题被标记为重复,但它没有解决手头问题的答案。因此,如果Stack Overflow社区帮助我解决我的问题,我会很高兴。谢谢。
答案 0 :(得分:2)
这样做:
const X * pobj = new X(58);
// ^^^^^^
func(&pobj);
现在pobj
是一个指向const的指针 - X
,其地址的类型为const X **
。
如果要保留原始(可变)指针,则需要先创建一个新的const指针:
X * p = new X(58);
const X * q = p;
func(&q);
答案 1 :(得分:2)
您需要将const
应用于指向指针:
void func(X *const *);
...
X * const *pp=&pobj; // ERROR
func(&pobj); // ERROR
...
void func(X * const * obj) { // module code goes here
}
答案 2 :(得分:0)
如果Ajay的答案不合适,因为你无法改变func()的界面,
如果Kerrek的答案不起作用,因为func()更改指针,必须将其分配回来,这不会发生:
X * p = new X(58);
const X * q = p;
func(&q);
p = q; // errror
然后简单地使用一个演员:
func(const_cast<const X**>(&p))