我在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_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);
}
请帮助 - 我正在失去头发。
答案 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
{
...