0

クラスを作成し、そのオブジェクトを cuda カーネルに渡しました。

カーネルのコードは次のとおりです。

__global__ void kernel(pt *p,int n)
{
int id=blockDim.x*blockIdx.x+threadIdx.x;
if(id<n)
{
    p[id]=p[id]*p[id];
}}

そして、次のエラーが発生します。error: ‘int pt::a’ is private

問題は、クラスのプライベート メンバーにアクセスするにはどうすればよいかということです。

プライベート メンバーが存在しなければ、プログラムは正常に実行されます。

class pt{
int a,b;
public:
pt(){}
pt(int x,int y)
{
    a=x;
    b=y;
}
friend ostream& operator<<(ostream &out,pt p)
{
    out<<"("<<p.a<<","<<p.b<<")\n";
    return out;
}
int get_a()
{
    return this->a;
}
int get_b()
{
    return this->b;
}
__host__ __device__ pt operator*(pt p)
{
    pt temp;
    temp.a=a*p.a;
    temp.b=b*p.b;
    return temp;
}
pt operator[](pt p)
{
    pt temp;
    temp.a=p.a;
    temp.b=p.b;
    return temp;
}
void set_a(int p)
{
    a=p;
}
void set_b(int p)
{
    b=p;
}};
4

2 に答える 2

1

クラスのプライベート メンバーには、そのメンバー関数とそのフレンドのみがアクセスできます。

于 2011-05-17T08:48:31.683 に答える
1

C++ コードにいくつかのエラーがあります。

これは私のマシン(CUDA 4.0 Mac Osx)でコンパイルされます

#include <iostream>

class pt {
    int a,b;
public:
    __host__ __device__ pt(){}
    __host__ __device__ pt(int x,int y) : a(x), b(y)
    {
    }

int get_a()
{
    return this->a;
}
int get_b()
{
    return this->b;
}

__host__ __device__ pt operator*(pt p)
{
    pt temp;
    temp.a=a*p.a;
    temp.b=b*p.b;
    return temp;
}
pt operator[](pt p)
{
    pt temp;
    temp.a=p.a;
    temp.b=p.b;
    return temp;
}
void set_a(int p)
{
    a=p;
}
void set_b(int p)
{
    b=p;
}

friend std::ostream& operator<<(std::ostream &out,pt p);

};

std::ostream& operator<<( std::ostream &out,pt p)
{
    out<<"("<<p.a<<","<<p.b<<")\n";
    return out;
}

__global__ void kernel(pt *p,int n)
{
int id=blockDim.x*blockIdx.x+threadIdx.x;
if(id<n)
{
    p[id]=p[id]*p[id];
}}
于 2011-09-17T04:43:01.967 に答える