int_type 没有命名类型的挫败感
int_type not naming type frustration
我在 中有一个虚拟方法类型 int_type
这是代码给出编译错误的唯一情况:
‘int_type’ does not name a type
int_type ThreadLogStream::overflow(int_type v)
^.
到目前为止的调试步骤
如果我在 Qt Creator IDE 中将鼠标悬停在 int_type
的任何其他实例上,它会显示 traits_type::int_type std::basic_streambuf::int_type
,这意味着 int_type
的所有其他实例] 不应该引起问题。
根据this reference,int_type确实属于basic_streambuf
,但是叫它Traits::int_type
不行。
我试图对问题变量进行类型定义,如下面的类型定义所示,但 char_type
和 traits_type
未被识别。
threadlogstream.cpp
...
int_type ThreadLogStream::overflow(int_type a)
{
int_type b = a; //This gives no errors
return b;
}
...
threadlogstream.hpp
#include <iostream>
#include <streambuf>
#include <string>
//typedef std::basic_streambuf< char_type, traits_type> base_class;
//typedef typename base_class::int_type int_type;
class ThreadLogStream : public QObject, std::basic_streambuf<char> {
Q_OBJECT
public:
ThreadLogStream(std::ostream &stream);
~ThreadLogStream();
protected:
virtual int_type overflow(int_type v); // This gives no errors
virtual std::streamsize xsputn(const char *p, std::streamsize n);
}
请帮忙 - 我正在为此脱发。
看来您需要将其设为尾随 return 类型,如下所示:
auto ThreadLogStream::overflow(int_type v) -> int_type {
// ...
}
说明:int_type
需要在 ThreadLogStream
的范围内查找,但如果您有前导 return 类型,它将在命名空间范围内查找,因为它在 之前 你提到了名字 ThreadLogStream::overflow
,它触发了 ThreadLogStream
范围内的查找。通过将 return 类型 放在 qualified-id 之后,可以避免这个问题。
您的 int_type
似乎应该代表 std::basic_streambuf<>::int_type
。在这种情况下,在 out-of-class 成员定义中,您应该编写
ThreadLogStream::int_type ThreadLogStream::overflow(int_type a)
{
...
即为函数 return 类型使用 合格的 名称。参数名称在 class 范围内查找(这就是为什么仅仅 int_type
在参数列表中编译得很好)。但是 return 类型是在封闭范围内查找的,这就是为什么你必须明确地确定它的质量。
在 C++ 中一直如此。
然而,尾随 return 类型语法中的 return 类型(自 C++11 起可用)也在 class 范围内查找,这意味着您可以选择这样做
auto ThreadLogStream::overflow(int_type a) -> int_type
{
...
我在 int_type
这是代码给出编译错误的唯一情况:
‘int_type’ does not name a type
int_type ThreadLogStream::overflow(int_type v)
^.
到目前为止的调试步骤
如果我在 Qt Creator IDE 中将鼠标悬停在
int_type
的任何其他实例上,它会显示traits_type::int_type std::basic_streambuf::int_type
,这意味着int_type
的所有其他实例] 不应该引起问题。根据this reference,int_type确实属于
basic_streambuf
,但是叫它Traits::int_type
不行。我试图对问题变量进行类型定义,如下面的类型定义所示,但
char_type
和traits_type
未被识别。
threadlogstream.cpp
...
int_type ThreadLogStream::overflow(int_type a)
{
int_type b = a; //This gives no errors
return b;
}
...
threadlogstream.hpp
#include <iostream>
#include <streambuf>
#include <string>
//typedef std::basic_streambuf< char_type, traits_type> base_class;
//typedef typename base_class::int_type int_type;
class ThreadLogStream : public QObject, std::basic_streambuf<char> {
Q_OBJECT
public:
ThreadLogStream(std::ostream &stream);
~ThreadLogStream();
protected:
virtual int_type overflow(int_type v); // This gives no errors
virtual std::streamsize xsputn(const char *p, std::streamsize n);
}
请帮忙 - 我正在为此脱发。
看来您需要将其设为尾随 return 类型,如下所示:
auto ThreadLogStream::overflow(int_type v) -> int_type {
// ...
}
说明:int_type
需要在 ThreadLogStream
的范围内查找,但如果您有前导 return 类型,它将在命名空间范围内查找,因为它在 之前 你提到了名字 ThreadLogStream::overflow
,它触发了 ThreadLogStream
范围内的查找。通过将 return 类型 放在 qualified-id 之后,可以避免这个问题。
您的 int_type
似乎应该代表 std::basic_streambuf<>::int_type
。在这种情况下,在 out-of-class 成员定义中,您应该编写
ThreadLogStream::int_type ThreadLogStream::overflow(int_type a)
{
...
即为函数 return 类型使用 合格的 名称。参数名称在 class 范围内查找(这就是为什么仅仅 int_type
在参数列表中编译得很好)。但是 return 类型是在封闭范围内查找的,这就是为什么你必须明确地确定它的质量。
在 C++ 中一直如此。
然而,尾随 return 类型语法中的 return 类型(自 C++11 起可用)也在 class 范围内查找,这意味着您可以选择这样做
auto ThreadLogStream::overflow(int_type a) -> int_type
{
...