我有一个声明为:
的函数int myFunction(const float** ppArr, const int n, const int m);
当我这样称呼时:
float** ppArr = new float*[5];
// Some initialization of ppArr
int result = myFunction(ppArr, 5, 128); <<<< Error
,错误是(VS 2008 Express):
error C2664: 'Test_myFunction.cpp' : cannot convert parameter 1 from 'float **' to 'const float **'
WTF?我正在将一个浮动**转换为const float **。可能出现什么问题? :/
编辑:谢谢你非常快速的回复! :)
答案 0 :(得分:8)
请在C ++常见问题解答中阅读"Why am I getting an error converting a Foo** → Foo const**?"。
答案 1 :(得分:2)
看起来很奇怪,它实际上可以减少某些模糊情况下的const正确性,允许你间接修改const对象。
有关详细信息,请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17。
您可以做的是将Foo**
转换为Foo const* const*
,因为这不会让任何后门打开。
答案 2 :(得分:1)
只是为大多数有效的答案添加一个重要的观察结果:C和C ++的情况有所不同。虽然这个技巧在C ++中使用Foo const* const*
,但这在C中不起作用,它不接受这个并发出警告。
如果你想对Foo const* const*
进行类型安全演员,你必须采用更复杂的方法。
答案 3 :(得分:0)
float**
无法转换为const float**
。
可以将其转换为float* const*
和const float* const*
。像这样:
void f(float* const* p) {}
void h(const float* const* p) {}
int main() {
float** p= new float*[5];
f(p);
h(p);
}
使用GCC编译:http://ideone.com/RrIXl