gpt4 book ai didi

c++ - CUDA C++类被误认为是模板

转载 作者:行者123 更新时间:2023-12-02 10:26:21 31 4
gpt4 key购买 nike

我定义一个类。我想在CUDA的光线跟踪代码中添加一些纹理。当调用构造函数时,我使用new。

#ifndef TEXTURE_H
#define TEXTURE_H

#include "RTnextweek.h"
#include "vec3.h"

class texture
{
public:
__device__ virtual vec3 value(float u, float v, const vec3 &p) const = 0;
};

class const_texture : public texture
{
public:
__device__ const_texture() {}
__device__ const_texture(vec3 c) : color(c) { }

__device__ virtual vec3 value(float u, float v, const vec3 &p) const
{
return color;
}

public:
vec3 color;
};

class checker_texture : public texture
{
public:
__device__ checker_texture() {}
__device__ checker_texture(texture *t0, texture *t1) : even(t0), odd(t1) {}

__device__ virtual vec3 value(float u, float v, const vec3 &p) const
{
float sines = sin(10 * p.x()) * sin(10 * p.y()) * sin(10 * p.z());
if (sines < 0)
return odd->value(u, v, p);
else
return even->value(u, v, p);
}
public:
texture *even;
texture *odd;
};

#endif
编译器报告:
nvcc main.cu -o texture.exe
main.cu
E:\texture.h(7): error: argument list for class template "texture" is
missing

E:\texture.h(14): error: argument list for class template "texture" is missing
......
11 errors detected in the compilation of "main.cu".
我什至没有定义模板,但是编译器报告模板错误。我的代码有什么问题?为什么会发生此问题?

最佳答案

尽管没有很好的文档说明,但texture是C++运行时API的模板化类(例如here)。它在内部报头中定义,该报头在nvcc的预处理阶段自动包含在内。
如果将纹理类型重命名为其他类型,问题将消失。例如:

typedef float3 vec3;

class text
{
public:
__device__ virtual vec3 value(float u, float v, const vec3 &p) const = 0;
};

class const_text : public text
{
public:
__device__ const_text() {}
__device__ const_text(vec3 c) : color(c) { }

__device__ virtual vec3 value(float u, float v, const vec3 &p) const
{
return color;
}

public:
vec3 color;
};

class checker_texture : public text
{
public:
__device__ checker_texture() {}
__device__ checker_texture(text *t0, text *t1) : even(t0), odd(t1) {}

__device__ virtual vec3 value(float u, float v, const vec3 &p) const
{
float sines = sin(10 * p.x) * sin(10 * p.y) * sin(10 * p.z);
if (sines < 0)
return odd->value(u, v, p);
else
return even->value(u, v, p);
}
public:
text *even;
text *odd;
};
compile without error

关于c++ - CUDA C++类被误认为是模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64345442/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com