当尝试实际使用任何地址空间(常量、设备或线程)的引用时,我总是遇到相同的错误。这不会编译,并给出一个奇怪的错误:
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);
}
Run Code Online (Sandbox Code Playgroud)
错误是:
无法使用“const const Foo”类型的表达式初始化“const Foo”类型的对象参数
替换constant为任何其他内存地址说明符,这是相同的一般错误。无论它是直接传递到内核的引用还是由函数创建的线程本地引用,都没关系——由于此错误,我实际上无法以任何方式使用这些引用。它们是 const 引用还是非常量引用也没有什么区别。
唯一的解决方法是只获取一个副本,Foo而不是尝试使用对其的引用。我一直不明白这个奇怪的错误。我也尝试过将论证视为constant const 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);
}
Run Code Online (Sandbox Code Playgroud)
在不同的地方尝试使用const或不使用类似的尝试没有什么区别。
您的成员函数的限定通常必须与被调用者对象的类型匹配。如果你想在对象上调用这样的方法const constant,你可以这样限定你的方法:
int getter() const constant {\n return 1;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n金属着色语言规范规定 (\xc2\xa74):“任何作为指针或引用的变量都必须使用 [device、constant、thread、threadgroup 或 threadgroup_imageblock] 进行声明”。重要的是要理解this成员函数的参数是一个指针\xe2\x80\x94,基本上是一个不可见的函数参数\xe2\x80\x94,并且函数的限定会影响该指针的类型。实际上,您正在声明int getter(const constant Foo* this)。
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |