标签: manipulators

为什么C++流操作符没有调用操作符?

我想知道:例如,如果std::endl是常规函数,那为什么它缺少调用运算符(the operator())?

我知道它被设计为与insertion(<<)和extraction(>>)运算符一起使用.我试着像这样称呼它:

std::endl.();
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用.

c++ manipulators c++11

1
推荐指数
1
解决办法
82
查看次数

如何将std :: endl传递给函数并使用它?

我想弄清楚如何将操纵器传递std::endl给函数,然后在函数中使用传入的操纵器.我可以声明这样的函数:

void f(std::ostream&(*pManip)(std::ostream&));
Run Code Online (Sandbox Code Playgroud)

我可以这样称呼它:

f(std::endl);
Run Code Online (Sandbox Code Playgroud)

那一切都很好.我的问题是弄清楚如何在里面使用操纵器f.这不起作用:

void f(std::ostream&(*pManip)(std::ostream&))
{
  std::cout << (*pManip)(std::cout);            // error
}
Run Code Online (Sandbox Code Playgroud)

无论编译器如何,错误消息都归结为编译器无法确定operator<<要调用的内容.我需要修复哪些内容f才能编译代码?

c++ manipulators

1
推荐指数
1
解决办法
837
查看次数

模板,与'out <<"中的'operator <<'不匹配("'

我正在尝试重载<< operator for template,我收到了这个错误.

我想要实现的是重载operator <<,它将提供开括号,所有标签项由","和关闭括号分别为'out'.

这是我的代码的一部分:

template <typename T>
class arry{
    T *tab;
    int n;
public:
    arry(T *t, int x) : n(x),tab(t){};
    friend std::ostream & operator << (const std::ostream & out, const arry<T> & t)
    {
        out << "(";
        for(int i=0;i<t.n;i++){
            out << t.tab[i];
            if(i < t.n-1)
                out << ", ";
        }
        out << ")";
        return out;
    }
};
Run Code Online (Sandbox Code Playgroud)

最糟糕的是,我的构建日志为我提供了230条错误行,此时我有点困惑.

c++ templates operator-overloading manipulators

1
推荐指数
1
解决办法
58
查看次数

如何正确实现C++流操纵器endl?

我正在尝试为我的stream班级实现一个操纵器.我对操纵者知之甚少,但我认为我做的一切都是正确的.代码的相关部分如下:

class stream
{
public:
    stream& operator<<(bool b) { // send bool value and return *this; }
    stream& operator<<(const char str[]) { // send string and return *this }
}; 

inline stream& endl(stream& s) 
{
    return s << "\r\n";
}


class stream stream;

int main()
{
    stream << endl;
}
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,而不是调用endl编译器调用stream::operator<<(bool).任何的想法?

c++ operator-overloading manipulators

1
推荐指数
1
解决办法
303
查看次数

类的自定义流操纵器

我正在尝试编写一个简单的审计类,它通过运算符 << 获取输入,并在接收到这样的自定义操纵器后编写审计:

class CAudit
{
public:
    //needs to be templated
    CAudit& operator << ( LPCSTR data ) {
        audittext << data;
        return *this;
    }

    //attempted manipulator
    static CAudit& write(CAudit& audit) { 
        //write contents of audittext to audit and clear it
        return audit; 
    }

private:
    std::stringstream audittext;
};

//to be used like
CAudit audit;
audit << "Data " << data << " received at " << time << CAudit::write;
Run Code Online (Sandbox Code Playgroud)

我认识到代码中的重载运算符不返回流对象,但想知道是否仍然可以使用类似语法的操纵器。目前,编译器将 '<<' 视为二元右移运算符。

感谢您的任何意见,帕特里克

c++ stream manipulators

0
推荐指数
1
解决办法
2535
查看次数

自定义C++操纵器问题

我正在尝试在我的日志记录类中实现自己的流操纵器.它基本上是改变旗帜状态的终点操纵器.但是,当我尝试使用它时,我会得到:

ftypes.cpp:57: error: no match for ‘operator<<’ in ‘log->Log::debug() << log->Log::endl’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:67: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:78: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:90: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
Run Code Online (Sandbox Code Playgroud)

...

码:

class Log {
public:
  ...
  std::ostream& debug() { return log(logDEBUG); }  
  std::ostream& endl(std::ostream& out);           // manipulator
  ...
private:
  ... …
Run Code Online (Sandbox Code Playgroud)

c++ stream manipulators

0
推荐指数
1
解决办法
1528
查看次数

C++中noskipws的演示

我在 C++ 中尝试了 noskipws 操纵器,并编写了以下代码。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    string first, middle, last;

    istringstream("G B Shaw") >> first >> middle >> last;
    cout << "Default behavior: First Name = " << first << ", Middle Name = " << middle << ", Last Name = " << last << '\n';
    istringstream("G B Shaw") >> noskipws >> first >> middle >> last;
    cout << "noskipws behavior: First Name = " << first << …
Run Code Online (Sandbox Code Playgroud)

c++ manipulators

0
推荐指数
1
解决办法
4887
查看次数

将 std::left 作为参数传递

我有一个显示某些东西的功能,其中字符定位可以不同。函数看起来像这样:

void display(std::ostream & stream, std::ios_base & positioning);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试像这样调用此函数时

display_header(std::cout, std::left);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

error: non-const lvalue reference to type 'std::ios_base' cannot bind to a value of unrelated type 'std::ios_base &(std::ios_base &)'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么std::cout可以通过就好了,但std::left拒绝这样做。又有何lvalue reference to type 'std::ios_base'不同lvalue reference to type 'std::ios_base'

c++ io stream manipulators output

0
推荐指数
1
解决办法
240
查看次数