5

この種のものに関する情報を見つけるのに本当に苦労しています!:(

なぜこれが機能しないのか混乱しています:

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

なぜこれが機能しないのかわかりません。ポインターはアドレスを保持しますか? では、2 つのベクトル ポインターが同じアドレス (-es) を指しているかどうかを比較してみませんか?

4

2 に答える 2

7

これは、あなたが求めていることがうまくいかない簡単な例です。

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));

失敗します。

于 2013-08-08T12:37:47.357 に答える
4

あなたの2つのベクトルは異なるタイプであり、それらを比較することはできません.

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;
}

非常に奇妙なことをしていない限り、異なる型の 2 つのベクトルへのポインターは等しくなりません。異なる型の 2 つのベクトルで func を呼び出そうとすると、コンパイラ エラーが発生します。

于 2013-08-08T12:53:41.907 に答える