2012-04-02 81 views
1

我想了解運營商重載如何工作。運營商的解釋<< overload

我想代碼,以便我可以寫

Log(Log::LEVEL_ERR) << "fatal error: " << 13 ; 

而對於字符串和重載運算符使用數量兩者。

我現在有

class Log{ 
    public: 
    std::ostream& operator<<(char const*); 
} 

std::ostream& Log::operator<<(char const* text){ 
    if (Log::isToWrite()) { 
    printLevel(); 
    std::cout << text; 
    } 
    return std::cout; 
} 

這隻能得到是我的字符串,但數量不限,爲什麼呢?

編輯 @bitmask只是要清楚,你的意思是實現這樣的:

class Log{ 
    public: 
    friend Log& operator<<(Log& in, char const* text); 
} 

friend Log& operator<<(Log& in, char const* text){ 
    if (in.isToWrite()) { 
    in.printLevel(); 
    std::cout << text; 
    } 
    return std::cout; 
} 

因爲我得到這些,現在到處:

error: Semantic Issue: Invalid operands to binary expression ('Log' and 'const char [15]')

也許這是非常簡單的,但你能拼出來給我?
我真的不明白。

+0

,因爲它需要一個char *,和一個int不是隱式可轉化爲char * – 2012-04-02 00:24:45

回答

1

因爲您返回了ostream&,下一個<<運算符匹配operator<<(ostream&, int)。您應該使用return *this;(類型爲Log&),以便下一個<<運算符匹配爲您的類定義的運算符。

+0

但我得到'錯誤:無效的操作數的二進制表達式(「登錄」和「INT」)[3]' – kotoko 2012-04-02 00:35:33

+1

@kotoko:是的,因爲你只實現了'operator <<'來接受'char const *',但是你試圖將它傳遞給'int'。實現你的'operator <<'作爲模板。 – bitmask 2012-04-02 00:49:36

+0

@bitmask我不是說這不是一個好主意,但我從來沒有使用過模板。有沒有辦法使用自由形式的朋友功能呢? – kotoko 2012-04-02 00:59:56