int_type没有命名类型挫折

时间:2016-12-05 21:45:50

标签: c++ std typedef virtual-functions streambuf

我在code being adapted from here中有一个虚方法类型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不起作用。

  • 我尝试输入解决问题变量,如下面的typedef所示,但无法识别char_typetraits_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);
}

请帮助 - 我正在失去头发。

2 个答案:

答案 0 :(得分:1)

看起来你需要使它成为一个尾随的返回类型,如下所示:

auto ThreadLogStream::overflow(int_type v) -> int_type {
    // ...
}

说明:int_type需要在ThreadLogStream的范围内查找,但是如果你有一个前导返回类型,它将在命名空间范围内查找,因为它来自之前的 / em>你提到名称ThreadLogStream::overflow,它会触发ThreadLogStream范围内的查询。通过在 qualified-id 之后放置返回类型,可以避免此问题。

答案 1 :(得分:1)

您的int_type似乎代表std::basic_streambuf<>::int_type。在那种情况下,在类外成员定义中,您应该编写

ThreadLogStream::int_type ThreadLogStream::overflow(int_type a)
{
  ...

即。使用限定名称作为函数返回类型。在类范围中查找参数名称(这就是为什么仅int_type在参数列表中编译好的原因)。但是在封闭范围中查找返回类型,这就是为什么必须明确地对其进行质量处理。

这就是C ++中一直以来的样子。

但是,尾随返回类型语法中的返回类型(自C ++ 11以来可用)也在类范围中查找,这意味着您可以选择执行此操作

auto ThreadLogStream::overflow(int_type a) -> int_type
{
  ...