2013-11-09 55 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(目前的問題已經修復) –