模板化成员 class 地址的奇怪错误

Bizarre error on address of class with templated member

我在修改我的 class 结构时遇到了一个奇怪的错误,我无法用更简单的 classes 重现该错误。

情况:

我决定让 class Input 有一个指向 object 的引用(一个普通的旧指针),由用户的键输入操作,Camera.之前我通过 Input 的构造函数链接它们:Input in(&cam); 但是在 Camera 中包含一个模板化成员之后:Buffer<Layout> buffer 我的整个主要功能变得疯狂。

以前这没问题:

Camera cam();
Input in(&cam);
cam.setProj(glm::mat4(1.0f));    // Example of function call

headers当然在单独的文件中,实现在.cpp-files.

Input 有一个成员 Camera *cam 并且 Input 的构造函数是:

Input::Input(Camera *camera){
    this->cam = camera;
}

问题:

已经不行了。错误信息是:

Input::Input(Input &&): cannot convert argument 1 from 'Camera(__cdecl *)(void)' to 'Camera *'

此外,每次尝试调用 Camera 的函数都会出现两个额外的错误:expression must have class typeleft of '.func' must have class/struct/union.

尝试创建一个最小示例:

Tl;dr:没完全做到。或者至少问题不直接在于使用模板成员获取 class 的地址。以下代码有效。

#include <stdio.h>
#include <stdlib.h>

template <typename T>
class Member{
public:
    Member(T variable):var(variable){};
    T var;
};

class Owner{
public:
    Owner(int m):member(m){};
    Member<int> member;
};

class Referencer{
public:
    Referencer(Owner *o){this->op = o;};
    Owner *op;
};

int main(){
    Owner o(1);
    Referencer r(&o);
    printf("%d\n", r.op->member);    // Output is 1.

    return 0;
}

由于上面的示例有效,我不确定它是否真的影响了拥有模板成员的情况。我真的迷失了这个。非常感谢任何帮助!

Camera cam();

这是一个简单的函数声明。您声明一个返回 Camera 并接受零参数的函数。你的 MSVC 编译器抱怨它!

Input::Input(Input &&): cannot convert argument 1 from 'Camera(__cdecl *)(void)' to 'Camera *'

只需使用:

Camera cam;

并调用默认构造函数。