Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;比较不同类型的指针?_C++_Generics_Pointers_Vector - Fatal编程技术网

C++ C++;比较不同类型的指针?

C++ C++;比较不同类型的指针?,c++,generics,pointers,vector,C++,Generics,Pointers,Vector,我真的很难找到关于这些东西的信息( 我不明白这为什么不起作用: 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, v

我真的很难找到关于这些东西的信息(

我不明白这为什么不起作用:

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; 

我不明白为什么这不起作用,指针持有地址是吗?那么为什么不比较一下,如果两个向量指针…指向同一个地址(-es)?

这里有一个简单的例子,你所要求的不会起作用

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));
C;
B*B=&c;//有效的向上广播
断言(static_cast(b)=static_cast(&c));

将失败。

您的两个向量类型不同,无法进行比较

如果要检查是否未调用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;
}
模板布尔函数(向量常量和a、向量常量和b)
{
如果(&a==&b)返回false;
//做事
返回true;
}

除非您正在做一些非常奇怪的事情,否则指向不同类型的两个向量的指针将不相等。如果您尝试使用两个不同类型的向量调用func,则会出现编译器错误。

指针以实现定义的方式保存地址。
重新解释\u cast
可以自由更改实际的数字基于类型的值。看看c++中的静态强制转换和动态强制转换,你到底想实现什么?指向一种类型的向量的指针不应该等于指向另一种类型的向量的指针。也许你可以使用
func
方法发布一些代码。@dunc123,我把它作为一种安全机制,以防出现这样的情况:`func(b,b)'@H2CO3我认为
reinterpret_cast
不允许根据类型更改数值。从文档中可以看出:“操作结果是值从一个指针到另一个指针的简单二进制副本。”如果
First
Second
是同一类型,OP就会遇到这个问题。如果不是,他们的问题是将指针与两个不相关的类型进行比较。@juanchopanza:措辞可能不是最精确的,但他在基本问题上是正确的:不能忽略类型(这就是问题所在)比较指针因为即使对象是相同的,上面的比较也会失败。+1实际上,对于某些类型可能有一种方法……难道
dynamic_cast
不应该总是找到最派生的类型地址吗?这意味着,如果我将两个指针强制转换到同一类型(它们都从该类型继承),比较工作,独立于继承链是如何构建的?我理解正确吗?尽管此模板只具有一种类型,但我需要将向量指针与(可能的)进行比较不同类型来检查它们是否指向同一个向量。我明白这根本不可能吗?@可选:也许你可以编写一些代码,在这种情况下,即两个不同类型的向量指针指向同一个向量?@可选:怎么会发生这种情况?一个对象在m中的给定位置有一个类型emory可以有类型为T的对象或类型为U的对象(或不相关的对象,或根本没有对象…),但对于不相关的类型T和U,永远不可能有类型为T的对象和类型为U的对象(尽管它可能是类型为T和U的对象)(通过继承,但在
std::vector
!)
template <typename T> bool func(vector<T> const & a, vector<T> const & b)
{
if (&a == &b) return false;
// do stuff
return true;
}