簡體   English   中英

未知類型的C ++算術:無效指針?

[英]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 = &ic;
        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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM