Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++_Ios_Gpu_Metal - Fatal编程技术网

C++ 如何访问C+上的成员+;金属内核中的引用或指针?

C++ 如何访问C+上的成员+;金属内核中的引用或指针?,c++,ios,gpu,metal,C++,Ios,Gpu,Metal,在尝试实际使用任何地址空间(常量、设备或线程)的引用时,我总是会遇到相同的错误。这不会编译,并给出一个奇怪的错误: struct Foo { int getter() const { return 1; } }; void use_foo(constant Foo& foo) { int x = foo.getter(); // error here } kernel void test_kernel(constant Foo& foo

在尝试实际使用任何地址空间(常量、设备或线程)的引用时,我总是会遇到相同的错误。这不会编译,并给出一个奇怪的错误:

struct Foo {
    int getter() const {
        return 1;
    }
};

void use_foo(constant Foo& foo) {
    int x = foo.getter(); // error here
}

kernel void test_kernel(constant Foo& foo [[buffer(0)]]) {
    use_foo(foo);
}
错误是:

无法使用“const constant Foo”类型的表达式初始化“const Foo”类型的对象参数

用任何其他内存地址说明符替换
常量
,这与一般错误相同。不管它是直接传递到内核的引用还是由函数创建的线程本地引用——由于这个错误,我实际上无法以任何方式使用这些引用。它们是常量还是非常量引用也没有区别

唯一的解决办法是只复制一份
Foo
,而不是尝试使用对它的引用。我一直不明白这个奇怪的错误。我也尝试过将参数作为
常量Foo&
和其他尝试和错误

有人能建议如何实际使用参考资料吗

如果切换到使用指针而不是引用,则会出现类似错误:

由此:

struct Foo {
    int getter() const {
        return 1;
    }
};

void use_foo(constant const Foo* const foo) {
    int x = foo->getter(); // error here
}

kernel void test_kernel(constant Foo* foo [[buffer(0)]]) {
    use_foo(foo);
}
类似尝试在不同位置使用或不使用
const
也没有区别。

您通常必须匹配被调用对象的类型。如果要对
常量对象调用此类方法,可以将方法限定为:

    int getter() const constant {
        return 1;
    }

声明(§4):“任何作为指针或引用的变量必须用[device、constant、thread、threadgroup或threadgroup_imageblock]声明。”。理解成员函数的
参数基本上是一个不可见的函数参数,并且函数上的限定会影响该指针的类型,这一点很重要。实际上,您正在声明
int getter(const constant Foo*this)

只是一个猜测,但是是否可以限定方法
int getter()const constant
?哇@jtbandes这确实是一个很好的猜测,我还没有尝试过。成功了!你以前见过这种问题吗?你怎么知道要试试这个?!唯一的问题是,如果成员函数不用于
常量const
引用,那么我需要一个没有添加
常量的相同重载,否则会出现类似错误。但这已经解决了,令人惊讶。这令人惊讶。不错的推论,@jtbandes!还有一个想法:可能值得为你收到的错误消息提交一份错误报告,这并不能真正解释实际问题。继续独白:你收到的错误消息实际上看起来是由我链接的补丁之前的代码版本生成的。很可能金属编译器是作为一个叮当声的分支进行维护的,并且从2017年起从未合并到我的变更中。我想知道如果他们使用了我的补丁,这个错误消息是否会更好,因为如果他们添加了新类型的
BadConversionSequence
;),编译器可能会提醒他们更新该代码再次感谢您,从您的评论中,您在这个问题上学到了很多!