簡體   English   中英

我如何解釋這個C ++錯誤

[英]How can I interpret this C++ error

我有這行代碼(行是字符串類型):

char* p = line.data;

在您做出回應之前,我已經弄清楚我做錯了什么,最后需要加括號。 我想問你的是我應該如何解釋我得到的錯誤,以備將來參考:

error: cannot convert 'std::basic_string<_CharT, _Traits, _Alloc>::data<char, std::char_traits<char>, std::allocator<char> >' from type 'const char* (std::basic_string<char>::)()const noexcept (true)' to type 'char*'

所以首先我必須問,這可能會更令人困惑嗎? C ++開發人員如何應對這樣的事情? 感謝天堂提供的高級語言,對嗎? 好的,所以所有這些問題都只是口頭上的。

好,所以我現在已經讀了大約十二次此錯誤。 我還查看了字符串數據方法文檔,它確實說它返回一個char *。 因此,我對以下內容感到困惑:

  1. 引用此:

     basic_string<_CharT, _Traits, _Alloc> 

根據basic_string文檔,它具有一個模板參數,但是此錯誤似乎是在說三個:_CharT,_Traits和_Alloc。 為什么說文檔中有一個基本字符串有三個模板參數? 我想我不明白如何解釋該文檔或該錯誤消息。

  1. 看起來數據部分也有模板參數,

     ...::data<char, std::char_traits<char>, std::allocator<char> > 

但根據“數據”方法文檔,其定義如下:

    const char* data() const noexcept;

我在該定義中看不到任何模板參數。 為什么錯誤消息顯示所有這些模板參數?

  1. 然后變得更加混亂,錯誤消息說它正在嘗試從類型強制轉換:

     const char* (std::basic_string<char>::)()const noexcept (true) 

所以我認為這是C ++描述函數類型的方式,對嗎? 為什么在括號中以真這個詞結尾?

所以我想我主要是想弄清楚為什么C ++異常具有所有這些奇怪的模板參數,而我在任何文檔中都沒有看到這些參數。

您提供的錯誤消息似乎被嚴重錯誤引用(或被解析器破壞)。 GCC產生以下內容

error: cannot convert ‘std::basic_string<_CharT, _Traits, _Alloc>::data<char, std::char_traits<char>, std::allocator<char> >’ from type ‘const char* (std::basic_string<char>::)()const’ to type ‘char*’
  1. 我不知道什么文檔告訴您std::basic_string只有一個模板參數。 它有三個。

  2. 類本身和類的成員函數是獨立的模板。 因此basic_string是模板類,成員函數basic_string::data()是單獨的模板函數。 該錯誤消息為您提供了該data模板功能的全名

     std::basic_string<_CharT, _Traits, _Alloc>::data<char, std::char_traits<char>, std::allocator<char> > 

    第一部分

     std::basic_string<_CharT, _Traits, _Alloc> 

    只是類名,其余的是模板函數,其實際模板參數列在函數名稱后。 絕對不是引用此模板的完美方法。 它很可能是從某種程度上從編譯器的內部工作派生的。

  3. 從語言的角度來看,“從函數類型廣播”部分沒有邏輯。 從C ++語言的角度來看, line.data根本不是有效的表達式。 因此,它沒有類型。 但是,顯然GCC編譯器的內部工作將該組合視為成員函數類型的一種表達。 錯誤消息實際上將該類型顯示為

     const char* (std::basic_string<char>::)()const 

    其他編譯器也可以做到這一點。 同樣,這只是編譯器的內部機制。

實際上,C ++程序員處理此錯誤的方式是重復多次重復同一錯誤,以使他們通常可以識別錯誤消息的“形狀”,而不必詳細閱讀。

通常,當我在源代碼行上出現錯誤時,我會做的是看我是否做過一些愚蠢的事情(無需詳細閱讀錯誤消息)。 僅當該操作失敗並且看不到它時,我才會讀取錯誤消息,並查看編譯器在抱怨什么。 有時它仍然難以理解,我不得不回頭尋找一些愚蠢的東西。 在極端情況下,在我弄清楚之前,可能會發生幾次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM