2013-08-06 92 views
2

我的任務是設置一個使用TTK(觸發工具包)提供服務的Debian服務器。爲什麼不用這個C++代碼編譯?

但是,該軟件似乎是從1997年開始的,並且沒有維護,並且不會在GCC(g++)下默認編譯(v4.7.2)。

一些錯誤來源於未指定std命名空間,並且我修復了這些錯誤。

但是,我遇到了類似的問題,該類似乎包含在軟件中用於硬件兼容性,特別是其功能read

類,從我所瞭解,應該是硬件的抽象的字節順序(或類似性質的東西):

public: 
    Architecture() 
    { 
     short y = 256; 
     short *x=&y; 
     alpha_byte_ordering = (*((char*) (x) + 1)) == 1 ? 1 : 0; 
     if (alpha_byte_ordering) 
     fprintf(stderr, "Architecture: detected alpha byte ordering.\n"); 
     else fprintf(stderr, "Architecture: detected non-alpha byte ordering.\n"); 
    } 

    int read(istream &is, short *s) 
    { 
     if (!is.read(s, sizeof(short))) return 0; 
     if (!alpha_byte_ordering) reverse_byte_order(s); 
     return 1; 
    } 

還有許多其他的重載read功能,他們都吐了出來錯誤,例如此一:

Architecture.H: In member function ‘int Architecture::read(std::istream&, short int*)’: 
Architecture.H:31:34: error: no matching function for call to ‘std::basic_istream<char>::read(short int*&, long unsigned int)’ 

看來,如果此碼是無知C++標準我認爲指定istream::read應該接受的字符陣列(char *)的,而不是不同的類型,如short *double *(我實際上讀取的是here,不在標準中)。

我是不是不正確地解釋這段代碼?自1997年以來標準的這一方面發生了變化嗎?或者是這個代碼只是無法使用(我有很高的懷疑,因爲有文章寫它)?

最後,我該如何解決這個問題? Casting schar * C風格似乎消除了錯誤,但我不確定它是否解決了問題。

回答

0

readread函數想要一個指向字符類型的指針(即在你的情況下爲char*)作爲第一個參數。您需要使用reinterpret_cast才能正確投射指針。

is.read(reinterpret_cast<char*>(s), sizeof(*s)) 
+0

這似乎這樣的伎倆。然而,我認爲'reinterpret_cast'只用於多態類型,並且C型轉換足以用於基本類型和指針...... – corazza

+0

@Yannbane'reinterpret_cast'是執行C風格轉換的C++方式,而'static_cast' 'dynamic_cast'是針對多態類型的。 –

+0

@Yannbane看到[這個問題](http://stackoverflow.com/questions/8427107/c-style-cast-vs-reinterpret-cast)的詳細解釋 – nijansen

相關問題