2016-03-25 63 views
2

我有以下代碼正在使用Visual C++ 10,但不是在Linux GCC:GCC:模板預先定義的錯誤

class basic_format 
{ 
    ... 
    basic_format() : str_(), fmt_() {} 
    ... 

    template <class ValueT> 
    basic_format& operator%(const ValueT& x) 
    { 
    ... 
    } 

    template <class Ch, class Tr> 
    friend std::basic_ostream<Ch, Tr>& operator<<(
     std::basic_ostream<Ch, Tr>& sout, const basic_format<Ch, Tr>& f) 
    { 
     ... 
    } 
    ... 
} 

用途:

query << basic_format<char_type>("%s %s HTTP/%.1f\r\n") % method % path % this->version(); 

編譯器破口大罵:

Multiple markers at this line 
    - ‘template<class Ch, class Tr> std::basic_ostream<_CharT, _Traits>& clx::operator<<(std::basic_ostream<_CharT, _Traits>&, const clx::basic_format<Ch, 
    Tr>&)’ previously defined here 
    - redefinition of ‘template<class Ch, class Tr> std::basic_ostream<_CharT, _Traits>& clx::operator<<(std::basic_ostream<_CharT, _Traits>&, const 
    clx::basic_format<Ch, Tr>&)’ 

我正在使用GCC 4.4.7 我可以在GCC上做些什麼來避免這個錯誤嗎?

+0

詳細解釋你想做什麼。運營商的聲明在哪裏,在其他類別內部?這段代碼的目的是 - 與一些現有的操作員朋友或者定義新的朋友操作員或者替換現有的操作員? – user2807083

+0

@ user2807083這兩個定義在同一個類中。我使用這兩個模板格式化HTTP請求,如問題中所示。 – cristian

回答

0

GCC 4.9.3,編譯和正常工作:

#include <iostream> 

template<class Ch = char, class Tr = std::char_traits<char>> 
class basic_format 
{ 
    template <class C, class T> 
    friend std::basic_ostream<C, T>& operator<<(
      std::basic_ostream<C, T>& sout, const basic_format<C, T>& f) 
    { 
     return sout << "lol"; 
    } 
}; 

int main() 
{ 
    std::cout << basic_format<>() << std::endl; 
} 
+0

感謝您的回覆。我正在使用GCC 4.4.7我試過你的例子,它只有在我啓用時才起作用:g ++ -std = C++ 0x。無論如何,在我的項目上做同樣的事情並不能解決這個錯誤。可能與這樣一個事實有關,即在同一個cpp中,它定義了另一個具有相同參數列表的模板?我在原來的問題中加入了這個。 – cristian

+0

@ cristian該模板具有不同的名稱,所以它不是原因。檢查「此處定義的」這一行。如果它不存在於代碼中,則會發生模板的隱式實例化並導致錯誤。如果可以,發佈錯誤消息提及的行。 – xinaiz

+0

發生錯誤的唯一行是我帖子中的第3行(在最後標記爲「<--- ERROR」)。我不明白你想要我檢查哪一行:( – cristian

0

的解決方案是將第二個模板的Def類的外部沒有「朋友」,只保留裏面的聲明:

class basic_format 
{ 
    basic_format() : str_(), fmt_() {} 

    template <class ValueT> 
    basic_format& operator%(const ValueT& x) 
    { 
    ... 
    } 

    template <class Ch, class Tr> 
    friend std::basic_ostream<Ch, Tr>& operator<<(
     std::basic_ostream<Ch, Tr>& sout, const basic_format<Ch, Tr>& f); 
} 

template <class Ch, class Tr> 
std::basic_ostream<Ch, Tr>& operator<<(
    std::basic_ostream<Ch, Tr>& sout, const basic_format<Ch, Tr>& f) 
{ 
    ... 
}