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

时间:2014-08-13 02:46:01

标签: c++

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

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>
    
  2. 根据basic_string文档,它有一个模板参数,但是这个错误似乎说有三个:_CharT,_ Traits和_Alloc。当documentation表示有一个时,为什么这个基本字符串有三个模板参数?我想我不明白如何解释该文档或该错误信息。

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

      ...::data<char, std::char_traits<char>, std::allocator<char> >
      
    2. 但是根据'data'方法文档,它的定义如下:

          const char* data() const noexcept;
      

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

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

        const char* (std::basic_string<char>::)()const noexcept (true)
        
      2. 所以我认为这是C ++描述函数类型的方式,是吗?为什么在括号中以单词true结尾?

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

2 个答案:

答案 0 :(得分: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*’
  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
    

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

答案 1 :(得分:2)

实际上,C ++程序员处理这个问题的方法是重复产生相同的错误,以便他们通常可以识别&#34;形状&#34;错误信息,而不是必须详细阅读。

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