2012-10-28 29 views
0

我的結構在我的C++代碼中有鑄造問題。我使用C風格的鑄造。但是,如果我嘗試使用替代名稱(使用typedef創建),我有一個錯誤。請看看我的代碼。 鑄造到用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創建的替代名稱來解決此問題?

回答

1

原因你的錯誤是在第一typedef struct kIdS* kIdN你在你的類名爲kIdS沒有結構,所以C++編譯器認爲你是在談論全球struct kIdS,然後typedef全球結構來kIdN和線struct kIdS* knv1[] = {&A, (kIdN)&B};錯誤是顯而易見的,全球struct kIdS*不能用來代替T::kIdS*,但我有一個問題從你,你爲什麼用struct X,而你可以簡單地說X

+0

感謝您的回答。你對全球結構是正確的。解決方案是在typedef之前放置結構定義。現在編譯器知道struct是本地的。現在我知道,而不是結構X我們可以簡單地使用X.謝謝。 –

2

爲什麼不使用繼承?

struct tIdS : public kIdS { ... } 
+0

因爲我用C++代碼進行集成純C代碼,只需要很少的更改。使用繼承我會有另一個問題。 –

1

我會擺脫過多的typedef。

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

typedef kIdS* kIdN; 
typedef kIdS kIdR; 

..... 

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