Тема: перевантаження операторного методу введення в шаблоному классі

доброго дня, не можу зрозуміти де є помилка в коді
Velyki_Cili_Chysla.h
[code=cpp]
#include <iostream>
using namespace std;

#pragma once
template < class T>
class Velyki_Cili_Chysla
{
private:
    T _chys;

public:
    friend istream &operator>> (istream &stream, Velyki_Cili_Chysla<T> &ob);
    Velyki_Cili_Chysla();
    ~Velyki_Cili_Chysla();
};[/code]
Velyki_Cili_Chysla.cpp
[code=cpp]
#include "StdAfx.h"
#include "Velyki_Cili_Chysla.h"
#include <iostream>
using namespace std;
//template<typename T> Velyki_Cili_Chysla;
template <class T>
Velyki_Cili_Chysla<T>::Velyki_Cili_Chysla() { }
template < class T>
istream &operator>> (istream &stream, Velyki_Cili_Chysla<T> &ob)
{
    stream>>ob._chys;
    return stream;
}
template < class T> Velyki_Cili_Chysla<T>::~Velyki_Cili_Chysla() { }
[/code]
саме повідомлення помилкок
error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Velyki_Cili_Chysla<int>::Velyki_Cili_Chysla<int>(void)" (??0?$Velyki_Cili_Chysla@H@@QAE@XZ) в функции _main    C:\Users\User\Documents\Visual Studio 2010\Projects\kursova_OOP\kursova_OOP\kursova_OOP.obj    kursova_OOP

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Velyki_Cili_Chysla<int>::~Velyki_Cili_Chysla<int>(void)" (??1?$Velyki_Cili_Chysla@H@@QAE@XZ) в функции _main    C:\Users\User\Documents\Visual Studio 2010\Projects\kursova_OOP\kursova_OOP\kursova_OOP.obj    kursova_OOP

error LNK1120: 2 неразрешенных внешних элементов    C:\Users\User\Documents\Visual Studio 2010\Projects\kursova_OOP\Debug\kursova_OOP.exe    1    1    kursova_OOP

2

Re: перевантаження операторного методу введення в шаблоному классі

1. Використовуйте теги code. Поважайте тих, кого просите про допомогу.
2. Вам літерами по екрану написано: помилка "в функции _main". Я тут ніякої функції main не бачу.

Подякували: leofun011

3

Re: перевантаження операторного методу введення в шаблоному классі

вибачаюсь , тупанув жостоко , але всеодно компілятор не бачить перевантаження методу введення для шаблоного классу

#include "stdafx.h"
#include "Velyki_Cili_Chysla.h"
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
    Velyki_Cili_Chysla<int> v_i();
    cin>>v_i;
    cin.get();
}

текст помилки :
IntelliSense: отсутствует оператор ">>", соответствующий этим операндам

4

Re: перевантаження операторного методу введення в шаблоному классі

А де проголошений цей оператор?

підказка

friend не проголошує оператор, а проголошує оператор другом

5

Re: перевантаження операторного методу введення в шаблоному классі

По-перше. Шаблонні функції, класи та їхні методи не можуть просто так бути розділені на .h та .cpp файли.
Оскільки вони є "шаблонами" для компіляторів для генерації справжніх методів для заданих шаблонних параметрів, то визначення і класів, і їхніх методів мають бути доступні в будь-якому .cpp файлі, де вони використовуються(інакше кажучи, шаблони, оголошені в .cpp файлі, видні тільки в цьому файлі, бо вони самі не є кодом, що компілюється).
По-друге, коли оголошуєте v_i, заберіть дужки. Конструктор за замовчуванням викличеться і без них, а з ними компілятор може сприймати v_i як вказівник на функцію.
По-третє, ваш перевантажений оператор є шаблонним, відповідно і як друг у класі він теж має бути оголошений як шаблон.
Найпростіше зробити так:
Velyki_Cili_Chysla.h

#pragma once
#include <iostream>
template < typename T> 
class Velyki_Cili_Chysla
{
private:
    T _chys;
public:
    template<typename E>
        friend std::istream& operator>>(std::istream &stream, Velyki_Cili_Chysla<E> &ob);
    Velyki_Cili_Chysla(void) {}
    ~Velyki_Cili_Chysla(void) {}
};

template < typename T> 
std::istream& operator>>(std::istream &stream, Velyki_Cili_Chysla<T> &ob)
{
    stream >> ob._chys;
    return stream;
}

main.cpp

#include <iostream>
using namespace std;
int main(void)
{
    Velyki_Cili_Chysla<int> a;
    std::cin >> a;
    //...
    return 0;
}

P.S. І ще - в фалах .h бажано не використовувати жодних директив using, бо якщо будете робити повноцінну бібліотеку, то потім через них можуть виникнути конфлікти імен.

Подякували: koala, martinyuk.ivan, leofun013

6

Re: перевантаження операторного методу введення в шаблоному классі

YurkoFlisk, дякую вам за допомогу ,сильно мене виручили.