4

Я должен использовать явную специализацию для функции-члена класса в (C++, я использую MS Visual Studio 2008 SP1), но я не смог ее скомпилировать. Получение C2910Шаблонная специализация функции-члена

об ошибке: 'File :: Оператор < <': не может быть явно специализированы

class File 
{ 
    std::ofstream mOutPutFile; 
public: 
    template<typename T> 
    File& operator<<(T const& data); 
}; 


template<typename T> 
File& File::operator<< (T const& data) 
{ 
    mOutPutFile << preprosesor(data); 
    return *this; 
} 

template< > 
File& File::operator<< <> (std::ofstream& out) 
{ 
    mOutPutFile << out; 
    return *this; 
} 
+0

http://stackoverflow.com/search?q=%5BC%2B%2B%5D+specialize+member+function –

+0

Вы работаете в Windows; версия MSVC может быть актуальной. Это часто помогает людям давать лучшие ответы, если вы даете такую ​​информацию. –

+1

Возможный дубликат [Формат специализации шаблонов функций] (http://stackoverflow.com/questions/937744/function-template-specialization-format) –

ответ

5

Вашей явной специализация оператор < < не соответствует списку параметров декларации; T const& data vs std::ofstream& out. Этот компилируется в MSVC10.

template<> 
File& File::operator<< <std::ofstream> (const std::ofstream& out) 
    { 
    mOutPutFile << out; 
    return *this; 
    } 

Уведомление const добавлено перед параметром функции.

+0

Обратите внимание, что здесь приведено значение rvalue - оно отображается в правой части << в использовании. Когда вы определяете (глобальный) оператор <<, то ostream должен быть не const для компиляции. Это не проблема. – emsr

+0

Это mOutPutFile, а не std :: ofstream & out, которое написано здесь. – Andrey