функция друга ostream специализированного шаблонного класса - PullRequest
1 голос
/ 19 декабря 2011
template <> 
class test<int> {
    int y; 
public:     
    test(int k) : y(k) {}     
    friend ofstream& operator<< <test<int>> (ofstream& os, const test<int>& t); 
};  
template<> 
ofstream& operator<< <test<int> > (ofstream& os, const test<int>& t) 
{
    os << t.y;
    return os;
}  

Приведенный выше код является специализированным шаблоном класса test в версии int. Я пытаюсь перегрузить функцию потока оператора <<. Но это показывает сообщение об ошибке; </p>

C2027: использование неопределенного типа 'std :: basic_ofstream <_Elem, _Traits>'

Кроме того, тот же метод работает с обычной функцией (не оператора ofstream <<, а функции, которую я создаю). Есть ли нам в любом случае оператор << функции ofstream в специализированном классе шаблона? </p>

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Вам необходимо включить

 #include <iostream>

Во время создания шаблона функции.Возможно, вы включили только

 #include <iosfwd>

Кроме того, вы не должны определять (статического) друга в качестве шаблона: https://ideone.com/1HRlZ

#include <iostream>

template <typename> class test;

template <> 
class test<int> {
    int y; 
public:     
    test(int k) : y(k) {}     
    friend std::ostream& operator<<(std::ostream& os, const test& t); 
};  

std::ostream& operator<< (std::ostream& os, const test<int>& t) 
{
    return os << t.y;
}  

int main()
{
    test<int> a(42);
    std::cout << a << std::endl;
}

Обратите внимание, что это не такхорошая идея использовать 'namespace std' в вашем заголовочном файле, поэтому я удалил его из примера.( Это может вызвать конфликты у пользователей вашего заголовочного файла, если они включают ваш заголовок )

0 голосов
/ 19 декабря 2011

Здесь есть ряд интересных вопросов. Сначала очевидная уборка

  • Вы должны #include <fstream> и не забудьте using namespace std.
  • operator << не должен быть шаблоном, это должна быть перегруженная функция.
  • os << t.y сбивает с толку компилятор для меня (g ++ 4.4.3: "предупреждение: ISO C ++ говорит, что они неоднозначны, хотя худшее преобразование для первого лучше, чем худшее преобразование для второй: "). Вы намерены выдвинуть int в поток, но компилятор замечает, что int может быть превращен в test<int> через ваш конструктор, и поэтому он не знает, хотите ли вы вставить int или test<int>. Это глупо, я знаю, и можно решить, сделав конструктор explicit.

    #include <fstream>
    using namespace std;
    template <typename T>
    class test;
    
    template <>
    class test<int> {
        int y;
    public:
        explicit test(int k) : y(k) {}
        // friend ofstream& operator<<   < test<int> > (ofstream& os, const test<int>& t); 
        friend ofstream& operator<< (ofstream& os, const test<int>& t);
    };
    // template<> 
    // ofstream& operator<< <test<int> > (ofstream& os, const test<int>& t) 
    ofstream& operator<<  (ofstream& os, const test<int>& t)
    {
        os << t.y;
        return os;
    }
    int main() {
    }
    
...