C++ C++;f(无效*&;调用时出错

C++ C++;f(无效*&;调用时出错,c++,C++,请解释以下代码中的错误: void foo(void*& param) { param = new char[10]; } void main() { int* p; foo(p); } error C2664: 'foo' : cannot convert parameter 1 from 'int *' to 'void *&' 如何使用任何指针类型调用函数并在函数中更改指针(不是该地址的值,而是地址本身)。我不想使用模板或双指针。如果要更新指针

请解释以下代码中的错误:

void foo(void*& param)
{
    param = new char[10];
}

void main()
{
    int* p;
    foo(p);
}

error C2664: 'foo' : cannot convert parameter 1 from 'int *' to 'void *&'

如何使用任何指针类型调用函数并在函数中更改指针(不是该地址的值,而是地址本身)。我不想使用模板或双指针。

如果要更新指针,最好将指针传递给指针

void foo(void** param)
{
    *param = new char[10];
}

void main()
{
    void* p;
    foo(&p);
    int* p2 = (int*)p;
}

如果要更新指针,最好将指针传递给指针

void foo(void** param)
{
    *param = new char[10];
}

void main()
{
    void* p;
    foo(&p);
    int* p2 = (int*)p;
}

为什么不能将
int*
作为参数传递给
f

问题是,如果允许这样做,您将破坏类型系统。老实说,这正是你想要做的。。。如果要中断类型系统,则需要通过强制转换显式请求它


您在注释中指出不希望使用强制转换,另一方面,编译器不希望您破坏类型系统。在那场遗嘱之战中,我不认为你能说服编译器。。。它太顽固了。

为什么不能将
int*
作为参数传递给
f

问题是,如果允许这样做,您将破坏类型系统。老实说,这正是你想要做的。。。如果要中断类型系统,则需要通过强制转换显式请求它



您在注释中指出不希望使用强制转换,另一方面,编译器不希望您破坏类型系统。在那场遗嘱之战中,我不认为你能说服编译器。。。它太顽固了。

我不想使用模板。您的丢失。您的编译器接受
void main()
?看起来您将有大量内存泄漏。为什么不想使用模板?我认为这种方法有几个问题。如果您不需要调用构造函数/析构函数,那么直接使用
malloc()
可能更便于移植。您的编译器可能无法在此正确处理数组
delete
。如果您确实需要它们,那么此代码将不会调用它们。
我不想使用模板
。您的丢失。您的编译器接受
void main()
?看起来您将有大量内存泄漏。为什么不想使用模板?我认为这种方法有几个问题。如果您不需要调用构造函数/析构函数,那么直接使用
malloc()
可能更便于移植。您的编译器可能无法在此正确处理数组
delete
。如果您确实需要它们,那么此代码将不会调用它们。我不想使用强制转换。我希望我的foo函数能简单使用指针使用相同的类型是一种很好的做法。在代码中,您分配了10个字节的数据,然后尝试将其更改为int*。整数的长度为4字节。因此,您希望分配一个大小为2.5的数组。如果要更改指针类型,必须使用强制转换。您拒绝了所有实际回答您问题的解决方案。没有比这更简单的了。如果你使用
void*
来做任何不平凡的事情,你需要使用类型转换。@MichaelWilson我拒绝那些让foo调用更尴尬的答案-比如我需要声明两个变量来调用函数。我不想使用类型转换。我希望我的foo函数能简单使用指针使用相同的类型是一种很好的做法。在代码中,您分配了10个字节的数据,然后尝试将其更改为int*。整数的长度为4字节。因此,您希望分配一个大小为2.5的数组。如果要更改指针类型,必须使用强制转换。您拒绝了所有实际回答您问题的解决方案。没有比这更简单的了。如果你用
void*
做任何不平凡的事情,您将需要使用类型转换。@MichaelWilson我拒绝那些使foo调用更为棘手的答案-就像这样,我需要声明两个变量来调用函数。因为他试图在不使用模板的情况下进行泛型编程。@MikeDeSimone:所以让我们使用类型转换。。。编译器将强制执行类型安全,除非明确告诉它不要这样做。@MikeDeSimone这不是泛型编程。void f(void*)可以用任何指针类型调用,它不是一般编程:)@felics,在继续之前,确保
f
获得
int**
并且您正在传递
p
的地址。这是因为
f
试图更改指针本身而不是其内容。如果你写
f(p)
f
不能改变
p
本身。@Felics:是的,但是额外的间接性破坏了类型系统。额外的间接性提供了修改函数参数的工具,这就是问题的症结所在。对于类似的示例,请考虑:
void f(const int**p);int*p;f&p由于同一问题将无法编译。额外间接提供了以类型不安全的方式修改函数参数的工具(在这种情况下,您可以使
p
指向函数内部的
const int
,然后使用
*p
在函数外部对其进行修改).因为他试图不使用模板进行泛型编程。@MikeDeSimone:所以让我们来做一些转换吧。。。编译器将强制执行类型安全,除非明确告诉它不要这样做。@MikeDeSimone这不是泛型编程。void f(void*)可以用任何指针类型调用,它不是一般编程:)@felics,在继续之前,确保
f
获得
int**
并且您正在传递
p
的地址。这是因为
f
试图更改指针本身而不是其内容。如果你写
f(p)
f
不能改变
p
本身。@Felics:是的,但是额外的间接性破坏了类型系统。额外的间接性提供了修改函数参数的工具,这就是问题的症结所在。对于类似的示例,请考虑: