[英]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.