我该如何解释这个C++错误

msk*_*app 1 c++

我有这行代码(行是字符串类型):

char* p = line.data;
Run Code Online (Sandbox Code Playgroud)

在你回答之前,我已经弄明白我做错了什么,最后我需要一些括号.我想问你的是我应该如何解释我得到的错误以供将来参考:

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>
    
    Run Code Online (Sandbox Code Playgroud)

根据basic_string文档,它有一个模板参数,但是这个错误似乎说有三个:_CharT,_Traits和_Alloc.为什么这个基本字符串有三个模板参数,当文档说它有一个?我想我不明白如何解释该文档或该错误消息.

  1. 然后看起来数据部分也有模板参数,

    ...::data<char, std::char_traits<char>, std::allocator<char> >
    
    Run Code Online (Sandbox Code Playgroud)

但根据'data'方法文档,它的定义如下:

    const char* data() const noexcept;
Run Code Online (Sandbox Code Playgroud)

我在该定义中没有看到任何模板参数.为什么错误消息显示所有这些模板参数?

  1. 然后它变得更加混乱,错误消息说它正在尝试从类型转换:

    const char* (std::basic_string<char>::)()const noexcept (true)
    
    Run Code Online (Sandbox Code Playgroud)

所以我认为这是C++描述函数类型的方式,是吗?为什么它以括号中的单词结尾?

所以我想我主要是想弄清楚为什么C++异常具有我在任何文档中都没有看到的所有这些奇怪的模板参数.

AnT*_*AnT 5

您提供的错误消息似乎被严重错误引用(或由解析器破坏).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*’
Run Code Online (Sandbox Code Playgroud)
  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> >
    
    Run Code Online (Sandbox Code Playgroud)

    第一部分

    std::basic_string<_CharT, _Traits, _Alloc>
    
    Run Code Online (Sandbox Code Playgroud)

    只是类名,而其余的是模板函数,在函数名后面列出了实际的模板参数.这绝不是引用此模板的完美方式.很可能它是以某种方式从编译器的内部工作中派生出来的.

  3. 从语言的角度来看,"从函数类型转换"部分没有逻辑.从C++语言的角度来看,line.data根本不是一个有效的表达式.因此它没有类型.然而,显然GCC编译器的内部工作方式将该组合视为成员函数类型的表达.错误消息实际上显示类型为

    const char* (std::basic_string<char>::)()const
    
    Run Code Online (Sandbox Code Playgroud)

    其他编译器也知道这样做.同样,这只是编译器的内部机制.