2013-11-09 58 views
0

我创建了我自己的LOGGER,其中我使用了一个用于超载宏的额外类。 有#define qlcd MacroCall(QLC :: Debug),所以我可以使用这样的记录器:qlcd < < message; 没关系,但是当我尝试使用qlcd(“日志名称”)时出现错误。看最少的代码(用于简化没有宏):Enum in构造函数Qt C++

#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; 
} 
+0

qDebug()不是 “调试器” –

+0

我的意思是记录器XD ,thx)) –

+0

当你得到“一个错误”,你需要准确地描述错误是为了m让别人很容易帮助你。 – SirDarius

回答

2

代码

MacroCall(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)’ 
} 
+1

事实上,最令人头疼的解析罢工再次。 [stmt.ambig]/1声明它可以是一个表达式语句或一个声明,它被定义为一个声明。 [stmt.ambig]/2 states“消歧 先于解析,并且作为声明消歧的语句可能是格式错误的声明。” – dyp

+0

酷chalenge! XD我通过使用构造函数(int t){type = QLC :: Types(t)}来修复它的任何其他方式? –

2

你给编译(除了QLC& operator<<(const QVariant var)有返回的东西的方法)的代码沉绵我不知道它是如何应该被使用。

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

+0

不,它是整个单个文件。这是一个最小代码,可用性你可以看看这里:https://github.com/ammaximus/QLogCat/tree/master/qlc(目前的问题已经修复) –