2012-03-05 74 views
3

我經常困擾const正確性,這似乎也不例外。請告訴我爲什麼下面的代碼不會編譯:無法轉換參數 - 轉換失去限定符

class string_token_stream 
{ 
    public: 

    typedef wchar_t* string_type; 

    string_token_stream(const string_type input_string) 
     : _input_string(input_string) 
    { 
    } 

    private: 

    const string_type _input_string; 
}; 

int main(int argc, char **argv) 
{ 
    const wchar_t *str = get_a_string_somewhere(); 
    string_token_stream sts(str); 
    //      ^------ Compile-time error C2664. 
    return 0; 
} 

給出的錯誤是:

error C2664: 'string_token_stream::string_token_stream(const string_token_stream::string_type)' : cannot convert parameter 1 from 'const wchar_t *' to 'const string_token_stream::string_type' 
1>   Conversion loses qualifiers 

我在編譯的Visual C++ 2010速成。可根據要求提供其他編譯/鏈接器選項。

回答

5

當您編寫const string_type input_string時,typedef將忽略const。所以你試圖將const wchar_t*轉換爲wchar_t*。 如果您將typedef wchar_t* string_type;更改爲typedef const wchar_t* string_type;,它應該進行編譯。

const string_type input_string看起來像wchar_t *const input_string而你期望const wchar_t*。您可以通過將const wchar_t *str更改爲wchar_t *const str來查看,它也可以工作。

+0

「... const被忽略...」。你能更精確地說明爲什麼忽略這個常量(或者在轉換中沒有考慮到)嗎? – 2012-03-05 04:50:13

+1

@ J.N .:'string_token_stream(const string_type input_string)'中的'const'使'input_string'爲const,而不是它指向的內容。如果你嘗試在函數內部分配'input_string',編譯器會給你一個錯誤,比如'只讀參數'input_string''的賦值。我認爲這是來自'const/volatile type'和'type const/volatile'等價的事實,順序並不重要。 – 2012-03-05 05:06:59

+0

@亞歷克斯:是的,謝謝,我自己弄清楚了,所以有一個相關的問題。 – 2012-03-05 05:17:31

1

行,所以根據該answer,在僞碼:

"const string_type" <=> "const (char *)" <=> char const *  and not "(const char) *". 

所以,const wchar_t*不能轉換到const string_type

相關問題