vs2017非标准语法。使用'& '创建成员指针

时间:2017-09-27 12:49:27

标签: c++

我收到此错误

  

USCENEComponent = GetComponentRotation:非标准语法。使用&创建成员指针。

编译此代码时:

if (!Player_isDead) {
    FVector fwd = GetActorForwardVector();
    FVector muzzle = GetMesh()->GetBoneLocation("pinky_01_r");
    muzzle += fwd * 155;

    AProjectile* bullet = GetWorld()->SpawnActor<AProjectile>(BPProjectile, muzzle, RootComponent->GetComponentRotation); // <<===== error
    if (bullet) {
        //bullet->Firer = this;
        bullet->ProxSphere->AddImpulse(fwd*BulletLaunchImpulse);
    }
    else {
        GEngine->AddOnScreenDebugMessage(0, 5.f, FColor::Yellow, "no bullet actor could be spawnd. is the bullet overlapping something?");
    }
}

我应该添加什么?我不知道。请详细告诉我。 ㅠㅠ

2 个答案:

答案 0 :(得分:1)

GetComponentRotation是一种方法。你想用这个方法做什么?打电话给它,还是拿地址?我们不知道,编译器也不知道。它猜对了你想要的地址。我的猜测是你想打GetComponentRotation。在这种情况下,添加参数列表,即使它是空的:RootComponent->GetComponentRotation( )

答案 1 :(得分:1)

USCENEComponent = GetComponentRotation应为USCENEComponent = GetComponentRotation()(或具有适当参数列表的某些变体)。 GetComponentRoation()是函数调用;在C ++中,你不能在没有括号的情况下调用函数,即使它不带参数。

警告有点误导。它的目的是创建一个指向成员的指针函数。像这样:

struct C {
    void f();
};

void (C::*pmf)() = &C::f;

右侧的那一位创建一个指向结构f的成员函数C的指针。

关于“非标准语法”的业务是微软主义。任何合理的编译器都会告诉您需要括号来调用函数。微软给你这个警告的原因是,在过去,微软认为能够创建一个指向成员函数的指针是有意义的,如果上下文提供了它,则不提类名你和你在懒惰的时候没有&。所以这对微软的编译器是合法的:

struct C {
    void f();
    void g() { void (C::*pmf)() = f; }
};

他们甚至在其中一个标准会议上提出了一篇论文,建议标准应该允许这种语法。这没有去任何地方。

因此,在(错误地)允许该语法的情况下,他们通过对使用其无效语法的代码发出误导性警告来选择向后兼容性。在形式上,这没关系:标准对不符合规范的代码施加的唯一要求是编译器“发出诊断”,并且我所知道的每个编译器都认为警告是诊断。