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

C++ 我如何解释这个C++;错误,c++,C++,我有这行代码(行的类型为string): 在你回答之前,我已经知道我做错了什么,我需要在结尾加上括号。我想问你的是,我应该如何解释我得到的错误,以备将来参考: 错误:无法将“std::basic_string::data”从类型“const char*(std::basic_string::)()const noexcept(true)”转换为类型“char*” 所以首先我必须问,这可能会更令人困惑吗?你究竟是如何开发C++开发人员的?感谢上天赐予我们更高级的语言,对吗?好的,所有这些问题都是修

我有这行代码(行的类型为string):

在你回答之前,我已经知道我做错了什么,我需要在结尾加上括号。我想问你的是,我应该如何解释我得到的错误,以备将来参考:

错误:无法将“std::basic_string::data”从类型“const char*(std::basic_string::)()const noexcept(true)”转换为类型“char*”

所以首先我必须问,这可能会更令人困惑吗?你究竟是如何开发C++开发人员的?感谢上天赐予我们更高级的语言,对吗?好的,所有这些问题都是修辞性的

好的,我已经读了十几遍了。我还查看了字符串数据方法文档,它确实说它返回一个char*。因此,我对以下几点感到困惑:

  • 关于这一点:

    basic_string<_CharT, _Traits, _Alloc>
    
    我在该定义中没有看到任何模板参数。为什么错误消息会显示所有这些模板参数

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

    const char* (std::basic_string<char>::)()const noexcept (true)
    
    const char*(std::basic_string::)()const noexcept(true)
    
  • 所以我认为这是C++描述函数类型的方式,对吗?为什么它以括号中的“真”一词结尾


    <> P> >我想我主要是想知道为什么C++异常有所有这些奇怪的模板参数,这些文件在任何文档中都看不到。

    < P>在实际中,C++程序员处理的方式是重复犯同样的错误,这样他们就可以普遍地认识到“形状”。而不必详细阅读错误消息


    通常,当我在源代码行中遇到错误时,我所做的是查看我是否做了一些愚蠢的事情(没有详细阅读错误消息)。只有当这失败了,我看不到它,然后我读了错误消息,看看编译器在抱怨什么。有时它仍然是难以理解的,我不得不回去寻找一些愚蠢的东西。在极端的情况下,在我发现之前可能会发生几次。

    < P>在实践上,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*’
    
    第一部分

    std::basic_string<_CharT, _Traits, _Alloc>
    
    其他编译器也知道这样做。同样,这只是编译器的内部机制


    您提供的错误消息似乎被严重错误引用(或被解析器弄乱)。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*’
    
    第一部分

    std::basic_string<_CharT, _Traits, _Alloc>
    
    其他编译器也知道这样做。同样,这只是编译器的内部机制


    其他两个为默认值,如的参考中所示
    std::string
    仅在其typedef中使用三者中的第一个。而
    (true)
    noexcept
    的一部分。它是
    noexcept(true)
    ,与
    noexcept
    相同。无论如何,添加括号并不能单独解决问题
    char*
    无法保存
    const char*
    结果。FWW,Clang的错误要好得多:抱歉,我忘了提到我需要在开始时添加“const”,就像你说的。好点,C++编译器错误(不幸的是)大部分时间不是很有信息,至少可以说。添加模板,一切都会变得一团糟。通过一次又一次地抛出错误,你“了解”了它的真正含义。我不知道,我认为错误信息非常有用。它确切地告诉你它不能做什么;将带有特定签名的函数指针强制转换为
    char*
    。关于错误消息中的函数语法,这是因为编译器需要这些信息来确定兼容的函数类型
    const char*
    是返回类型,
    std::basic_string::
    是它绑定到的类,
    ()
    是参数类型列表,
    const
    是一个const方法,而
    noexcept(true)
    是抛出说明符。它排除该名称,因为该名称不是用于确定指针赋值有效性的函数签名规范的一部分。如果这有意义的话。其他两个都是默认值,如的参考中所示
    std::string
    仅在其typedef中使用三者中的第一个。而
    (true)
    noexcept
    的一部分。它是
    noexcept(true)
    ,与
    noexcept
    相同。无论如何,添加括号并不能单独解决问题
    char*
    无法保存
    const char*
    结果。FWW,Clang的错误要好得多:抱歉,我忘了提到我需要在开始时添加“const”,就像你说的。好点,C++编译器错误(不幸的是)大部分时间不是很有信息,至少可以说。添加模板,一切都会变得一团糟。通过一次又一次地抛出错误,你“了解”了它的真正含义。我不知道,我认为错误信息非常有用。它确切地告诉你它不能做什么;将带有特定签名的函数指针强制转换为
    char*
    。你希望错误消息会说什么?关于错误消息中的函数语法,那是因为它是所有的信息
    std::basic_string<_CharT, _Traits, _Alloc>::data<char, std::char_traits<char>, std::allocator<char> >
    
    std::basic_string<_CharT, _Traits, _Alloc>
    
    const char* (std::basic_string<char>::)()const