2012-11-29 104 views
1

我想使用C++ 11的可變特徵模板打印所有函數參數。我做了以下內容:隱式轉換運算符

struct concatenate 
{ 

    template< typename ...ARGS > 
    explicit 
    concatenate(ARGS const & ...args) 
    { 
     cat(args...); 
    } 

    /*explicit*/ 
    operator std::string const() const 
    { 
     return oss.str(); 
    } 

private : 

    std::ostringstream oss; 

    void cat() const 
    { ; } 

    template< typename T, typename ...ARGS > 
    void cat(T const & head, ARGS const & ...tail) 
    { 
     if (oss.tellp() > 0) { 
      oss << ' '; 
     } 
     oss << head; 
     cat(tail...); 
    } 

}; 

然後我嘗試測試它:

std::cout << '\'' << concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f) << '\'' << std::endl;

但隨後給出的代碼沒有錯誤編譯:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&' c:\mingw\lib\gcc\mingw32\4.7.0\include\c++\ostream:600: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = concatenate]'

什麼錯誤的性質是什麼?畢竟,編譯器別無選擇,只能使用轉換運算符。它不是?

+1

轉換運算符是顯式的,但是您沒有進行明確的轉換。 –

+0

它沒有區別。沒有'explicit'關鍵字都是一樣的。 – Orient

回答

3

操作者< <類模板的std :: basic_string的定義爲(免費)函數模板。與非模板函數相比,模板參數推導不涉及可能的參數轉換。對於basic_string,模板運算符< <需要一個字符串,因爲它的正確參數和隱式轉換(從串接到字符串)不起作用。

1

因爲你不使用顯式轉換運營商,你有沒有超載operator<<爲你的類它試圖撥打:

template <class charT, class traits, class T> 
basic_ostream<charT, traits>& 
operator<<(basic_ostream<charT, traits>&& os, const T& x); 

使用顯式轉換

std::string(concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f)) 

做正確的事。