C ++无效使用非静态数据成员

时间:2016-04-14 07:03:29

标签: c++ static-members

我已经查看了有关此错误的其他问题,但到目前为止我还没有找到我的问题的答案。我有两个课程MessageColorString。在前者的方法中,我通过将Message的成员传递给ColorString的构造函数来制作后者的几个实例

message.hpp

#ifndef __MESSAGE__HPP
#define __MESSAGE__HPP
#if defined __linux || defined __APPLE__
#define UNIXLIKE
#endif
////////////////////////////////////////////////////////////////////////////////
// Message helps organize error and warning messages                          //
////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <sstream>
#include <fstream>
#include "color.hpp"
////////////////////////////////////////////////////////////////////////////////
//                                  MESSSAGE                                  //
////////////////////////////////////////////////////////////////////////////////
class Message
{
////////////////////////////////////////////////////////////////////////////////
public: // types
////////////////////////////////////////////////////////////////////////////////
    typedef COLOR::ColorString                                           colstr;
    typedef COLOR::ColorID                                                color;
////////////////////////////////////////////////////////////////////////////////
public: // methods
////////////////////////////////////////////////////////////////////////////////
    Message(std::ostream& o = std::cerr)
    : o(std::cerr)
    {

    }
////////////////////////////////////////////////////////////////////////////////
    Message(const std::string& message,
        const std::string& label ="",
        const std::string file="",
        const int line = -1,
        std::ostream& o = std::cerr,
        const color c = COLOR::RED
        )
    : o(std::cerr)
    {

    }
////////////////////////////////////////////////////////////////////////////////
    friend std::ostream& operator<<(std::ostream& o, Message& m)
    {
        #ifdef UNIXLIKE
        colstr lbl(label, c);
        colstr msg(message);
        colstr ln(linestr);
        colstr fl(file);
        #else
    std::string lbl(label);
        std::string msg(message);
        std::string ln(linestr);
        std::string fl(file);
        #endif
    o << fl << ln;
    if (fl.size() > 0 || ln.size() > 0) o << ": ";
    o << lbl << " " << msg << "\n";
    o.flush();
    return o;
    }
////////////////////////////////////////////////////////////////////////////////
private: // methods
////////////////////////////////////////////////////////////////////////////////
    void init(const std::string& message,
          const std::string& label = "",
          const std::string file="",
          const int line = -1,
          std::ostream& o = std::cerr,
          const color c = COLOR::RED)
    {
    this->message = message;
    this->label = label;
    this->file = file;
    this->line = line;
    this->c = c;

    if (this->line > -1)
    {
        std::stringstream ss;
        ss << this->line;
        ss >> linestr;
    }

    if (this->file.size() > 0)
    {
        this->file = this->file+":";
        if (this->line > -1)
        {
        this->file = this->file+linestr; linestr="";
        }
    }
    }
////////////////////////////////////////////////////////////////////////////////
private : // fields
////////////////////////////////////////////////////////////////////////////////
    std::string label;
    std::string message;
    std::string file;
    int line;
    std::ostream& o;
    color c;
    std::string linestr;
};
#endif

ColorString的构造函数如下所示:

/**
 * @brief constructs a ColorString with color @p c and the string
 *        @p s.
 * @param s string to wrap
 * @param c color to print @p s in
 * @param bold determines whether @p s will be printed bold
 */
ColorString(str s, ColorID c=DEF, bool bold=1)
:string(s),
color(c),
bold(bold)
{
}

导致错误的部分是:

    #ifdef UNIXLIKE
    colstr lbl(label, c);
    colstr msg(message);
    colstr ln(linestr);
    colstr fl(file);
    #else

错误:

    message.hpp:58:20: error: invalid use of non-static data member 'label'
        colstr lbl(label, c);
                   ^~~~~
message.hpp:58:27: error: invalid use of non-static data member 'c'
        colstr lbl(label, c);
                          ^
message.hpp:59:20: error: invalid use of non-static data member 'message'
        colstr msg(message);
                   ^~~~~~~
message.hpp:60:19: error: invalid use of non-static data member 'linestr'
        colstr ln(linestr);
                  ^~~~~~~
message.hpp:61:19: error: invalid use of non-static data member 'file'
        colstr fl(file);

这里的问题是什么?

1 个答案:

答案 0 :(得分:2)

问题是您正在定义friend功能。即使你在类中定义它们“inline”,它们仍然是非成员函数,需要一个对象实例来访问它们的成员。

你需要这样做。

colstr lbl(m.label, m.c);