转换为使用typedef创建的结构类型

时间:2012-10-28 08:11:30

标签: c++ casting

我的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创建的替代名称解决此问题?

3 个答案:

答案 0 :(得分:2)

为什么不使用继承?

struct tIdS : public kIdS { ... }

答案 1 :(得分:1)

我会摆脱过多的typedef。

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

typedef kIdS* kIdN;
typedef kIdS kIdR;

.....

kIdS* knv[] = {&A, (kIdS*)&B};
kIdS* knv1[] = {&A, (kIdN)&B};

答案 2 :(得分:1)

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