int_type 没有命名类型的挫败感

int_type not naming type frustration

我在 中有一个虚拟方法类型 int_type 这是代码给出编译错误的唯一情况:

‘int_type’ does not name a type
 int_type ThreadLogStream::overflow(int_type v)
 ^.

到目前为止的调试步骤

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
{
  ...