0

我正在创建自己的 LOGGER,我在其中使用了一个额外的类用于重载宏。有#define qlcd MacroCall(QLC::Debug),所以我可以像这样使用记录器:qlcd << message; 没关系,但是当我尝试使用 qlcd("log name") 时出现错误。看最少的代码(没有用于简化的宏):

#include <QVariant>
#include <QDebug>

class QLC
{
public:
// Error types
enum LevelType{
    Debug=0,  // Debug
    Error=1,  // Error
    WTF = 2   // WTF???
} level;

QString logger;

// Constructors
QLC(QLC::LevelType l)
    :level(l), logger(":")
{}

QLC(QLC::LevelType l, QString log)
    :level(l), logger(log)
{}

// OPERATOR <<
QLC& operator<<(const QVariant var){
    qDebug() << "(" + QString::number(level) + ")" << logger << var;
}
};

class MacroCall
{
QLC::LevelType level;
public:
MacroCall()
    :level(QLC::Debug){}

MacroCall(int i)
    :level(QLC::WTF){}

MacroCall(QLC::LevelType l)
    :level(l){}

QLC operator()(){
    return QLC(level);
}
QLC operator()(QString log){
    return QLC(level, log);
}
};

int main(int argc, char*argv[])
{
MacroCall()("WorkLog") << "No level, yes logname";
MacroCall(QLC::Error)() << "No logname, yes level";

MacroCall a(QLC::Error);
a("WorkLog") << "Logname and level at different lines";

// GET READY!
// INT as level and logname:
MacroCall(2)("WorkLog") << "WTF?? It works!";

//MacroCall(QLC::WTF)("NotWorkLog") << "It's not work!!!!!!";
// NOT WORK: error: invalid use of qualified-name 'QLC::WTF'
// Qt 4.8.3

return 0;
}
4

2 回答 2

2

您提供的代码可以编译(除了该方法QLC& operator<<(const QVariant var)必须返回某些内容),尽管我不确定它应该如何使用。

我的猜测是您的 2 个类是在不同的标头中定义的,并且缺少一个包含。标头是否Macrocall包括QLC标头?

于 2013-11-09T11:26:54.437 回答
2

编码

宏调用(QLC::WTF)(“NotWorkLog”)

被解释为变量的声明:

MacroCall QLC::WTF("NotWorkLog")

例子:

class A
{
    public:
    enum E {
        x=1
    };

    public:
    A(E) {}
    void operator()(int) const { }
};

class B {};

void f()
{
    (A(A::x))(1); // Ok
    A{A::x}(1); // Ok
    A(a)(A::x); // Ok

    A::E a; // ‘a’ has a previous declaration as ‘A a’
    A(A::x)(1); // invalid use of qualified-name ‘A::x’
    B(b)(A::x); // no matching function for call to ‘B::B(A::E)’
}
于 2013-11-09T11:32:44.590 回答