我有这段代码:
class C
{
virtual vec3 f1(const A* a, B* b){...}
virtual vec3 f2(A const* a, B const* b)
{
vec3 color = f1(a, b);
...
}
}
我想调用f1
来自 f2
,但我不知道如何以正确的方式传递 b 。
现在编译,我得到:
error: invalid conversion from 'const B*' to 'B* [-fpermissive]'
我试过了 vec3 color = f1(a, const_cast<B *>(b));
这会编译,但随后我在执行时遇到段错误。
请注意,我无法更改任何函数签名。
我也不能改变 A
的定义或 B
实现 getCopy()
例如函数。
更新:
我找到了一个返回 b 的修改拷贝的函数,所以我的问题就解决了。 感谢大家说服我停止尝试将其直接转换为 f1。
最佳答案
如果不能更改函数签名,就无法解决问题。从逻辑上讲,f2
正在与调用者签订契约(Contract):“我将使用 B* 并使用它,但我保证不会修改它指向的 B
”。如果您随后将该指针传递给 确实 修改 B
的其他内容,您就违反了约定。如果 f2
旨在修改 B
,则它所采用的 B*
不应该是 const
(也许它应该是 B&
,作为旁注)。
至于崩溃:修改最初声明为 const
的对象是未定义的行为。实际上,这意味着编译器可以自由地做一些事情,比如将它存储在只读内存中,以及其他棘手的事情。如果您然后尝试写入它,则所有赌注都将关闭。它可能会崩溃。它可以工作。任何事情都有可能发生。
关于c++ - 从 'const X*' 到 'X*' 的错误无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102947/