我有这行代码(行是字符串类型):
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 *。所以我对以下内容感到困惑:
参考:
basic_string<_CharT, _Traits, _Alloc>
根据basic_string文档,它有一个模板参数,但是这个错误似乎说有三个:_CharT,_ Traits和_Alloc。当documentation表示有一个时,为什么这个基本字符串有三个模板参数?我想我不明白如何解释该文档或该错误信息。
然后看起来数据部分也有模板参数
...::data<char, std::char_traits<char>, std::allocator<char> >
但是根据'data'方法文档,它的定义如下:
const char* data() const noexcept;
我在该定义中没有看到任何模板参数。为什么错误消息显示所有这些模板参数?
然后它变得更加混乱,错误消息显示它正在尝试从类型转换:
const char* (std::basic_string<char>::)()const noexcept (true)
所以我认为这是C ++描述函数类型的方式,是吗?为什么在括号中以单词true结尾?
所以我想我主要是想弄清楚为什么C ++异常具有我在任何文档中都没有看到的所有这些奇怪的模板参数。
答案 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*’
我不知道哪些文档告诉您std::basic_string
只有一个模板参数。它有三个。
类本身和类的成员函数是独立的模板。因此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>
只是类名,而其余的是模板函数,函数名后面列出了实际的模板参数。这绝不是引用此模板的完美方式。很可能它是以某种方式从编译器的内部工作中派生出来的。
从语言的角度来看,“从函数类型转换”部分没有逻辑。从C ++语言的角度来看,line.data
根本不是一个有效的表达式。因此它没有类型。
然而,显然GCC编译器的内部工作方式将该组合视为成员函数类型的表达。错误消息实际上显示类型为
const char* (std::basic_string<char>::)()const
其他编译器也知道这样做。同样,这只是编译器的内部机制。
答案 1 :(得分:2)
实际上,C ++程序员处理这个问题的方法是重复产生相同的错误,以便他们通常可以识别&#34;形状&#34;错误信息,而不是必须详细阅读。
通常当我在源代码行上出现错误时,我会做的是查看我是否做了一些愚蠢的事情(没有详细阅读错误消息)。只有当它失败并且我无法看到它时,我才会阅读错误消息,看看编译器在抱怨什么。有时它仍然难以理解,我不得不回去寻找愚蠢的东西。在极端情况下,在我弄清楚之前,这可能会发生几次。