[英]c++ arithmetic with unknown types:void pointers?
(我想处理“ void”,我避免使用“ template class”,因为这太麻烦了)
好,建立一些基础
int aa=3;
int bb=4;
int cc=0;
int *a, *b, *c;
a = &aa;
b = &bb;
c = &cc;
*c = *a +*b; //yields 7
但我要执行以下操作:
void *va;
void *vb;
void *vc;
va = a;
vb = b;
*c = (int)(*va + *vb); // <-- 3 errors see below
但是我得到了错误:
error C2100: illegal indirection
error C2100: illegal indirection
error C2110: cannot add two pointers
您不能取消引用void
指针。
如果要将它们转换为int*
,则应在取消引用之前进行;
(*(int*)vc) = (*(int*)va) + (*(int*)vb);
但是您最好更具体一些,确切地说您想做什么就是您所说的“以下”。
您根本无法对C或C ++中真正未知的类型执行很多操作。
您可以使用Boost Variant在一个变量中支持多种算术类型,也可以使用并union
并基本上通过自己区分来实现Boost Variant的功能。 或者,您可以构建类型层次结构并拥有虚拟方法来执行所需的操作。 但是您不能对类型被完全删除的值进行算术。
void
指针是一种特殊的指针,它专门表示没有类型。 这些通常用于为确实知道类型并且可以来回转换的呼叫者提供存储。
提领一void*
是没有意义的,并且是在-事实上,无效的语法,解引用指针的全部意义在于获得该项目被指出,如果你不指定哪些你指点,你不能让它。
要“修复”您的代码,需要在取消引用之前进行强制转换: http : //www.ideone.com/eKxxn
#include <iostream>
int main() {
int ia = 1, ib = 2, ic = -1;
int *a = &ia, *b = &ib, *c = ⁣
void *va, *vb;
va = a;
vb = b;
*c = (int)(*static_cast<int*>(va) + *static_cast<int*>(vb));
std::cout << *c; // Outputs "3"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.