2013-08-08 3 views
2

나는 이런 종류의 물건에 관한 정보를 찾는 데 정말로 힘든 시간을 보내고 있습니다! 이 작동하지 않는 이유 :(다른 유형의 포인터를 비교하는 C++?

내가 혼란 스러워요 :

vector<B*> b; 
vector<C*> c; 
(B and C are subclasses of A) 
(both are also initialized and contain elements etc etc...) 

template <class First, class Second> 
bool func(vector<First*>* vector1, vector<Second*>* vector2) 
    return vector1 == vector2; 

컴파일이 돌아 오면이 작동하지 않을 이유가 포인터를 개최, 표시되지 않습니다

Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

두 개의 벡터 포인터가 같은 주소 (-es)를 가리키는 지 비교하면 어떨까요?

+0

포인터는 주소를 구현 정의 방식으로 유지합니다. 'reinterpret_cast <>'는 유형에 따라 실제 숫자 값을 자유롭게 바꿀 수 있습니다. –

+0

C에서 정적 캐스트와 동적 캐스트 살펴보기 – user1939168

+0

정확히 달성하려는 것은 무엇입니까? 한 유형의 벡터에 대한 포인터는 다른 유형의 벡터에 대한 포인터와 절대로 같아서는 안됩니다. 어쩌면'func' 메소드를 사용하여 코드를 게시 할 수 있습니다. – dunc123

답변

3

여기에 간단한 예제가 나와 있습니다.

,
struct A{ int i; }; 
struct OhNoes { double d; }; 
struct B: public A {}; 
struct C: public OhNoes, public B {}; 

그래서 여기서, B 및 C는 그러나 A. 두 서브 클래스, C 인스턴스는 B 하위 객체와 동일한 주소가 어렵다. 이다

이 :

C c; 
B *b = &c; // valid upcast 
assert(static_cast<void*>(b) == static_cast<void *>(&c)); 

이 실패합니다.

+1

'첫 번째'와 '두 번째'가 같은 유형 인 경우 OP에서 발생하는 문제입니다. 그렇지 않다면, 문제는 두 개의 서로 관련이없는 유형에 대한 포인터를 비교하는 것입니다. – juanchopanza

+0

@juanchopanza : 문구가 가장 정확하지는 않지만 근본적인 문제에 맞습니다. 객체가 같더라도 위의 비교가 실패하므로 유형 * (질문)을 무시하고 포인터를 비교할 수 없습니다. . +1 –

+0

사실, 어떤 타입을위한 방법이 있을지도 모르지만 ... 'dynamic_cast '는 항상 가장 파생 된 타입의 주소를 찾지 않아야합니까? – Useless

4

두 벡터는 서로 다른 유형이므로 비교할 수 없습니다. 당신은 당신이 FUNC 호출하지 않습니다 있는지 확인하려면

(B, B) 당신은 시도 할 수 있습니다 :

template <typename T> bool func(vector<T> const & a, vector<T> const & b) 
{ 
if (&a == &b) return false; 
// do stuff 
return true; 
} 

다른 종류의 두 개의 벡터로 다음 포인터를 아주 이상한 일을하지 않는 것 평등하지 마라. 다른 유형의 두 벡터를 사용하여 func를 호출하면 컴파일러 오류가 발생합니다.

+0

이 템플릿은 하나의 유형을 가지고 있지만, 벡터 포인터를 (아마도) 다른 유형과 비교하여 동일한 벡터를 가리키고 있지 않은지 확인해야합니다. 나는 그것이 단지 불가능하다는 것을 이해하고 있는가? – optional

+0

@ 선택 사항 : 아마도 이런 경우가 될 수있는 코드를 작성할 수 있습니다. 즉, 서로 다른 유형의 벡터 포인터 두 개가 동일한 벡터를 가리 킵니다. – dunc123

+0

@ 선택 사항 : 어떻게 될 수 있습니까? 객체는 유형이 있습니다. 메모리의 주어진 위치에 T 유형의 객체 또는 U 유형의 객체 (또는 관련이없는 객체 또는 전혀 객체가 없습니다 ...)가있을 수 있지만 객체가있을 수 없습니다. T와 U가 아닌 유형의 객체 일 수도 있지만 (상속을 통해, 그러나 그것은'std :: vector'에서는 그렇지 않을 것입니다!) –

관련 문제