0

我的 C++ 代码中的结构存在强制转换问题。我使用 C 风格的铸造。但是,如果我尝试使用替代名称(使用创建typedef)进行转换,则会出现错误。请看我的代码。

class T
{
public:
    typedef struct kIdS* kIdN;
    typedef struct kIdS {
        int* a;
        double* b;
    }  kIdR;

    typedef struct tIdS {
        int* a;
        double* b;
        float* c;
    }  tIdR;

    int a;
    double b;
    float c;

    void F()
    {
        a = 0; 
        b = 0; 
        c = 0;
        struct kIdS A = {&a, &b};
        struct tIdS B = {&a, &b, &c};
        struct kIdS* knv[] = {&A, (struct kIdS*)&B};
        struct kIdS* knv1[] = {&A, (kIdN)&B}; //error
    }
};

错误是:

error C2440: 'initializing' : cannot convert from 'T::kIdN' to 'T::kIdS *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, 
    C-style cast or function-style cast

为什么我不能使用替代名称?我如何使用创建的替代名称来解决这个问题typedef

4

3 回答 3

2

为什么不使用继承?

struct tIdS : public kIdS { ... }
于 2012-10-28T08:18:56.163 回答
1

我会摆脱过多的typedef。

struct kIdS {
    int* a;
    double* b;
};

typedef kIdS* kIdN;
typedef kIdS kIdR;

.....

kIdS* knv[] = {&A, (kIdS*)&B};
kIdS* knv1[] = {&A, (kIdN)&B};
于 2012-10-28T08:20:50.643 回答
1

您的错误的原因首先是typedef struct kIdS* kIdN您的类中没有名为 的结构kIdS,因此 C++ 编译器认为您正在谈论一个全局struct kIdS,然后typedef全局结构kIdN和行内struct kIdS* knv1[] = {&A, (kIdN)&B};错误是显而易见的,struct kIdS*不能使用全局代替T::kIdS*, 但我有一个问题要问你,为什么你使用struct X而你可以简单地说X??

于 2012-10-28T08:28:55.540 回答