C++ Antlr cpp运行时是否有错误的指针转换?
我使用antlr cpp运行时得到以下错误。 伪代码:C++ Antlr cpp运行时是否有错误的指针转换?,c++,antlr,covariance,C++,Antlr,Covariance,我使用antlr cpp运行时得到以下错误。 伪代码: #include <iostream> #include <antlr4-common.h> #include <antlr4-runtime.h> using namespace antlrcpp; using namespace antlr4; using namespace std; class B{ public: virtual void myhello() = 0; }; c
#include <iostream>
#include <antlr4-common.h>
#include <antlr4-runtime.h>
using namespace antlrcpp;
using namespace antlr4;
using namespace std;
class B{
public:
virtual void myhello() = 0;
};
class A:public B{
public:
string name;
A (string a):name(a){
}
virtual void myhello(){
cout << "hello "<< name <<endl;
}
};
Any f1(){
A *a = new A("hello");
return Any(a);
}
Any f2(){
B* v= f1().as<B*>();
return Any(v);
}
int main(){
auto x = f2();
x.as<A*>()->myhello();
return 0;
}
#包括
#包括
#包括
使用名称空间antlrcpp;
使用名称空间antlr4;
使用名称空间std;
B类{
公众:
虚拟void myhello()=0;
};
A类:公共B类{
公众:
字符串名;
A(字符串A):名称(A){
}
虚拟void myhello(){
cout您不能强制转换f2()的结果
到A*
,因为A
派生自B
,而您只创建了B
的一个实例。这怎么可能成为一个有效的A
实例呢?您可能是想通过将A
作为基类,将B
作为派生类来颠倒名称吗?您无法转换的结果f2()
到A*
,因为A
派生自B
,而您只创建了B
的一个实例。那怎么可能成为有效的A
实例呢?您可能想通过将A
作为基类,将B
作为派生类来颠倒名称吗?您需要A,您的问题已经脱离主题了没有它。@UlrichEckhardt,我提供了足够的代码,请删除-1并重新打开问题。@machine\u 1我提供了足够的代码,请删除-1并重新打开问题。您能否同时提供编译该代码时得到的逐字错误消息?是的,我已经投票决定用给定的代码重新打开此问题。您需要一个问题没有它是离题的。@UlrichEckhardt,我已经提供了足够的代码,请删除-1并重新打开问题。@machine_1我已经提供了足够的代码,请删除-1并重新打开问题。你能不能也提供编译代码时得到的逐字错误消息?是的,我已经投票决定用给定的代码重新打开这个问题代码。在f2中,我将其设置为B*,在f1返回的任何对象的内容中,它存储了a*的指针。但是a*可以被视为B*作为任何时间。哦,对了。我错过了。然后我认为这是一个问题。从f2()
返回的任何对象不再包含a
的实例。它已经被B*v=f1().as()切掉了
。嗯,但我将指针传递给任何一个,指针的大小总是一样的。有什么专门处理指针的吗?在f2中,我将其传递给B*,在f1返回的任何内容中,它存储了a*的指针。但a*可以被视为B*。哦,对了。我错过了。然后我认为这是一个问题。您返回的任何对象f2()
中的urn不再包含A
的实例。它已被B*v=f1()切掉。as();
。嗯,但我将指针传递给任何对象,指针的大小始终与我猜的相同。有专门处理指针的对象吗?