2011-10-31 3 views
14

나는 C++ 프로그램을 가지고있다 :C++. 오류 : void는 포인터 - 개체 유형이 아닙니다.

struct arguments 
{ 
    int a, b, c; 
    arguments(): a(3), b(6), c(9) {} 
}; 

class test_class{ 
    public: 

    void *member_func(void *args){ 
     arguments vars = (arguments *) (*args); //error: void is not a 
               //pointer-to-object type 

     std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 
    } 
}; 

컴파일시 오류가 발생한다.

error: ‘void*’ is not a pointer-to-object type 

누군가이 오류를 생성하기 위해 내가 잘못하고있는 것을 설명 할 수 있는가?

+0

예, 있습니다. 'args'에 다른 데이터 형을 주려고 했습니까? – Blender

+2

이 예제에서는 "추상 형식"(추상적 기본 클래스를 의미하는 것으로 가정)이 없습니다. 아마도'* (arguments *) args'를 의미 할 것입니다.'args'는'void *'에서'arguments *'로 캐스팅되어, 다시 참조됩니다. 현재 코드는'void *'를 역 참조하려고합니다. (불법입니다.) 그리고 나서 역 참조 된 값을'arguments *'에 캐스트합니다. 이것은 거의 당신이 의도 한 것이 아닙니다. –

+0

@Chris 네, 그게 내가 해두려고했던 것입니다. 설명해 주셔서 감사합니다. Btw, 나는 구조체와 클래스가 추상적 인 유형으로 간주되는 동안 생각했다. int, float는 비 추상입니다. –

답변

17

당신은 void *를 역 참조됩니다 - (코멘트에서 언급 한 바와 같이 또한 복사 생성자를 방지하는) 대신이 시도 :

arguments vars = *(arguments *) (args); 
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 

을 양자 택일로, 당신은이 작업을 수행 할 수 있습니다 구체적인 유형. 컴파일러 (A void *이며, 역 참조 할 수없는) *args에 적용하는 방법을 알고하지 않기 때문에,

arguments vars = *(arguments *) (args); 

이 순서가 중요 : 당신은 주위에 그것을 다른 방법으로 할 필요가있다. (arguments *)은 무엇을해야할지 알려주지 만 너무 늦은 경우 참조가 이미 발생했기 때문입니다.

+1

하지만 여기서'static_cast'를 사용하십시오 - 당신은 더 좋은 에러 메시지를 얻을 것입니다 ... –

+0

@Billy'static_cast'는 무엇을합니까? –

+1

@Matt : 제한된 것을 제외하고는 C 스타일의 캐스트와 동일한 기능을합니다. 'static_cast'는'const'의 제거, 포인터 타입의 재 해석, 그리고 다른 몇 가지 불쾌한 것들을 허용하지 않습니다. 일반적으로 말하자면'static_cast'는 플랫폼/아키텍처 전반에서 작동합니다. 자세한 내용은 C++ 표준의 섹션 5.2.9를 참조하십시오 (C++ 03 가정) –

3

*의 위치가 잘못되었습니다. 따라서 void*의 참조를 취소하려고합니다. 에 캐스팅 전에

arguments *vars = (arguments *) (args); 
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n"; 
+0

복사 생성자를 피하기 때문에 포인터를 그대로 두는 것이 좋습니다. 그러나 OP는 포인터 ('arguments *'와'void *') 모두를 const로 만들어야합니다. –

0

* args는 "args가 가리키는 object (value)"를 의미합니다. 따라서 오브젝트 (인수)에 대한 포인터로 형변환 될 수 없습니다. 그것은 위의 오류를 재현하는 오류를

4

베어 뼈 예제를주고 이유 : 그것은 무효에 대한 포인터를 역 참조하려고하기 때문에

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9;    //good 
    void *pointer_to_void;  //good 
    pointer_to_void = &myint; //good 

    cout << *pointer_to_void; //error: 'void*' is not a pointer-to-object type 
} 

위의 코드는 잘못된 것입니다. 그건 허용되지 않습니다.

다음 코드를 실행하십시오. 왜 다음 코드가 실행되고 위의 코드가 실행되지 않는지 이해하면 더 나은 작업을 수행 할 수 있습니다.

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9; 
    void *pointer_to_void; 
    int *pointer_to_int; 
    pointer_to_void = &myint; 
    pointer_to_int = (int *) pointer_to_void; 

    cout << *pointer_to_int; //prints '9' 
    return 0; 
} 
0

는 bdonlan 등의 문제는 "캐스팅 전에 void*를 역 참조"있다고 말했다.

나는이 예제 도움이 될 생각 :

#include <iostream> 

using namespace std; 

int main() 
{ 



    void *sad; 
    int s = 23; 
    float d = 5.8; 

    sad = &s; 
    cout << *(int*) sad;//outputs 23//wrong: cout << *sad ;//wrong: cout << (int*) *sad; 



    sad = &d; 
    cout << *(float *) sad;//outputs 5.8//wrong: cout << *sad ;//wrong: cout << (float*) *sad; 

    return 0; 
} 
관련 문제