Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unresolved external при использовании шаблонов 
V
    Опции темы
tarasrng
Дата 10.5.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



Привет. пишу программу, используя шаблоны.  весь код лежит в Unit1.cpp:
Код

//---------------------------------------------------------------------------
#include <vcl>
#include <math>
#include <conio>
#include <iostream>
#include<vector>
#include <cstdio>
#include <cstring>
//---------------------------------------------------------------------------

using namespace std;

const int size = 30;            //максимальний розмір рядків

//---------------------------------------------------------------------------

char bufCyr[256];
char *Cyr(const char *text)     // виведення кирилиці
{
        CharToOem(text, bufCyr);
        return bufCyr;
}

//---------------------------------------------------------------------------
template <class T>
class SymbString                //базовий клас
{
private:
        char* ryadok;           // рядок
                        //довжина рядка

public:  int dov;
        SymbString::SymbString();               //конструктор без параметрів
        SymbString(const char* buf);            //конструктор що приймає С-рядок
        SymbString(char *symbol, int dovz);     //конструктор що приймає символ

        SymbString(const SymbString &obj);      //конструктор копіювання
        SymbString::~SymbString();              //деструктор

        static int countSS;                     // статичний член класу

        char StrLenght(char *s) { return dov = strlen(s)*sizeof(char) + 1; }  // обрахунок довжини рядка  ( +1 це додавання символу \0 )
        void GetRyadok(char *name) { strcpy(name,ryadok); }     //отримання рядка
        int GetDov() { return dov; }                            // отримання довжини
        void Clear() { ryadok = "\0"; dov=0; }                  // очищення рядка
        void PutRyadok();                                       // введення рядка
        void Show() { cout << Cyr("Рядок: ") << ryadok;         // вивід рядка на екран
                cout << Cyr("  Довжина рядка: ") << dov << endl; }
};

//---------------------------------------------------------------------------

int SymbString<class T>::countSS;        //ініціалізація  статичного члену

SymbString<T>::SymbString()        // Визначення конструктора  без параметрів
{
     //do something
}
//---------------------------------------------------------------------------

SymbString<T>::SymbString(const char* buf)   //визначення конструктора що приймає С-рядок
{
       //do something
}
//---------------------------------------------------------------------------

SymbString<T>::SymbString(char* symbol, int dovz)  //визначення конструктора що приймає символ
{
       //do something
}
//---------------------------------------------------------------------------

SymbString<T>::SymbString(const SymbString &obj)   //визначення конструктора копіювання
{
//do something
}
//---------------------------------------------------------------------------

SymbString< T>::~SymbString()     // Визначення деструктора
{
       //do something
}
//---------------------------------------------------------------------------

void SymbString<T>::PutRyadok()     //Введення рядка
{
//do something
}
//---------------------------------------------------------------------------


template <class T>
class ComplexString:public SymbString  <T> //похідних клас ... успадкування
{
private:
         double real; // Дійсна частина
         double image; // Уявна частина

public:
        char *com;
        ComplexString<T>::ComplexString();             //конструктор без параметрів
        ComplexString<T>(const char* buf);         //конструктор що приймає С-рядок
        ComplexString(const ComplexString<T> &obj);    //конструктор копіювання
        ComplexString::ComplexString(double real, double image);
        ComplexString<T>::~ComplexString();            //деструктор

        static int countCS;                // статичний член класу

        ComplexString& operator=(const ComplexString &op2);  // перевантаженння оператора =
        ComplexString operator+(ComplexString &OBJ1);  // перевантаженння оператора +
        ComplexString operator-(ComplexString &OBJ1);  // перевантаженння оператора -
        ComplexString operator*(ComplexString &OBJ1);  // перевантаженння оператора *
        ComplexString operator/(ComplexString &OBJ1);  // перевантаженння оператора /
        friend ostream& operator<<(ostream& os, ComplexString& x);// перевантаженння оператора <<
        friend istream& operator>>(istream& is, ComplexString& x);// перевантаженння оператора >>
        ComplexString operator==(ComplexString &op2);  // перевантаженння оператора ==
        void ClearC() { com="\0"; }   //очищення рядка
        void PutComplexString();      // введення рядка
        void ShowCom() { cout << Cyr("Комплексний рядок: ") << com  << endl; } // вивід
        void PutImage(double im) {image=im;}
        void PutReal(double re) {real=re;}
        void Check(char* ctc);       // перевірка
        void Convert (char *ctc);     //перетворення рядка в число


};
//---------------------------------------------------------------------------

int ComplexString<T>::countCS;   //ініціалізація  стат. члену. ; за замовч = 0

ComplexString<T>::ComplexString()     // Визначення конструктора без параметрів
{
        //do something
}
//---------------------------------------------------------------------------

ComplexString<T>::ComplexString(const char* buf)    // конструктор що приймає рядок
{
      //do something
}
//---------------------------------------------------------------------------

ComplexString<T>::~ComplexString<T>()       // Визначення деструктора
{
        //do something
}
//---------------------------------------------------------------------------

ComplexString<T>::ComplexString(const ComplexString &obj)   //визначення конструктора копіювання похідного класу
{
       //do something
}
//---------------------------------------------------------------------------

ComplexString<T>::ComplexString(double real, double image)    // конструктор що приймає два числа
{
      //do something
}

//----------------------------------------------------------------------------
void ComplexString<T>::PutComplexString()   // Введення комплексного числа
{
       //do something
}
//---------------------------------------------------------------------------

void ComplexString<T>::Convert(char *ctc)
{
//do something
}

//----------------------------------------------------------------------------
void ComplexString<T>::Check(char* ctc)   // перевірка
{
       //do something
}
//---------------------------------------------------------------------------


//-----------------------------------------
ComplexString<T> ComplexString<T>::operator+(ComplexString<T>& obj)   //Перевантаження оператора +
{                                               //додавання комплексних рядків
    //do something

}

//----------------------------------------------

ComplexString <T>ComplexString<T>::operator-(ComplexString &fp1)   //Перевантаження оператора -
{
      //do something

}
ComplexString <T>ComplexString<T>::operator*(ComplexString &fp1)   //Перевантаження оператора *
{
      //do something
}

ComplexString<T> ComplexString<T>::operator/(ComplexString &fp1)            //Перевантаження оператора /
    {
     //do something
    }


ostream& operator<<(ostream& os, ComplexString<T>& x)   //Перевантаження оператора <<
{
    //do something

}

istream& operator>>(istream& is, ComplexString<T>& x )   //Перевантаження оператора >>
{
     //do something
}

//---------------------------------------------------------------------------

//Перевантаження оператора присвоєння "=".
ComplexString<T>& ComplexString<T>::operator=(const ComplexString& op2)
{
 //do something
}


//---------------------------------------------------------------------------

// Перевантаження оператора порівняння "==".
ComplexString<T> ComplexString<T>::operator==(ComplexString &op2)
{

       //do something
}
//---------------------------------------------------------------------------
// оголошенння функцій
int Menu(), Op1(), Op2(), SubMenu1(), SubMenu2();

void ShowSub1(), ShowSub2();

void OperateS(SymbString<T> &obj), OperateC(ComplexString<T> &obj);

//---------------------------------------------------------------------------
int main()      // головна програма
{
      //do something
}

//---------------------------------------------------------------------------
int Menu()    // Отримання команди головного меню, вибраної користувачем.
{                //головне меню
       //do something
}
//---------------------------------------------------------------------------

void OperateS(SymbString<T> &obj)    // Опрацювання рядка базового класу
{//do something
}
//---------------------------------------------------------------------------
void OperateC(ComplexString<double> &obj)    // Опрацювання рядка похідного класу
{
     //do something
}
//---------------------------------------------------------------------------

int Op1()   // Робота з рядком базового класу.
{
    //do something
}
//---------------------------------------------------------------------------

int Op2()  // Робота з рядком базового класу.
{
        //do something
}
//---------------------------------------------------------------------------

int SubMenu1()    // Отримання команди під меню, вибраної користувачем.
{
       //do something
}
//---------------------------------------------------------------------------

void ShowSub1() // Отримання команди під меню, вибраної користувачем.  Символьний рядок
{
        //do something
}
//---------------------------------------------------------------------------

int SubMenu2()    // Вивід меню для початку роботи з комплексним числом
{
      //do something
}

//---------------------------------------------------------------------------

void ShowSub2()  // Отримання команди під меню, вибраної користувачем. Комплексне число
{
    //do something
}
//---------------------------------------------------------------------------






при компиляции выдает ошибки:

  [Linker Error] Unresolved external 'ComplexString<double>::~ComplexString<double>()' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'SymbString<double>::~SymbString<double>()' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'OperateC(ComplexString<T>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::ComplexString<double>(const char *)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::PutComplexString()' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator +(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator -(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator *(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator /(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator =(const ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'operator <<(_STL::basic_ostream<char, _STL::char_traits<char> >&, ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::Check(char *)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::Convert(char *)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::ComplexString<double>()' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'operator >>(_STL::basic_istream<char, _STL::char_traits<char> >&, ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'ComplexString<double>::operator ==(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
подскажите, пожалуйста, как исправить?


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Unit1.cpp 30,68 Kb
PM MAIL   Вверх
borisbn
Дата 10.5.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(tarasrng @  10.5.2012,  18:03 Найти цитируемый пост)
ComplexString<T>::ComplexString()

хммм. и такое компилируется в билдере ? не должно.
перед описанием шаблонной функции (хоть простой, хоть метода класса) нужно сказать, что она шаблонная 
Код

template< class T >
ComplexString<T>::ComplexString() {
...
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 10.5.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



borisbn, 
я указал, что функции шаблонные.

Код

//---------------------------------------------------------------------------
#include <vcl>
#include <math>
#include <conio>
#include <iostream>
#include<vector>
#include <cstdio>
#include <cstring>
//---------------------------------------------------------------------------

using namespace std;

const int size = 30;            //максимальний розмір рядків

//---------------------------------------------------------------------------

char bufCyr[256];
char *Cyr(const char *text)     // виведення кирилиці
{
        CharToOem(text, bufCyr);
        return bufCyr;
}

//---------------------------------------------------------------------------
template <class T>
class SymbString                //базовий клас
{
private:
        char* ryadok;           // рядок
                        //довжина рядка

public:  int dov;
        SymbString::SymbString();               //конструктор без параметрів
        SymbString(const char* buf);            //конструктор що приймає С-рядок
        SymbString(char *symbol, int dovz);     //конструктор що приймає символ

        SymbString(const SymbString &obj);      //конструктор копіювання
        SymbString::~SymbString();              //деструктор

        static int countSS;                     // статичний член класу

        char StrLenght(char *s) { return dov = strlen(s)*sizeof(char) + 1; }  // обрахунок довжини рядка  ( +1 це додавання символу \0 )
        void GetRyadok(char *name) { strcpy(name,ryadok); }     //отримання рядка
        int GetDov() { return dov; }                            // отримання довжини
        void Clear() { ryadok = "\0"; dov=0; }                  // очищення рядка
        void PutRyadok();                                       // введення рядка
        void Show() { cout << Cyr("Рядок: ") << ryadok;         // вивід рядка на екран
                cout << Cyr("  Довжина рядка: ") << dov << endl; }
};

//---------------------------------------------------------------------------

int SymbString<class T>::countSS;        //ініціалізація  статичного члену
template <class T>
SymbString<T>::SymbString()        // Визначення конструктора  без параметрів
{
        ryadok = new char[size];
        ryadok = "\0";
        dov = 0;
}
//---------------------------------------------------------------------------
template <class T>
SymbString<T>::SymbString(const char* buf)   //визначення конструктора що приймає С-рядок
{
        ryadok = new char[size];
        strncpy(ryadok , buf, size);
        ryadok[size]='\0';
        dov = StrLenght(ryadok);
}
//---------------------------------------------------------------------------
template <class T>
SymbString<T>::SymbString(char* symbol, int dovz)  //визначення конструктора що приймає символ
{
        ryadok = new char[size];
        strncpy(ryadok , symbol, 1);            // копіювання тільки одного символу
        ryadok[1]='\0';
        dov = 2;
}
//---------------------------------------------------------------------------
 template <class T>
SymbString<T>::SymbString(const SymbString &obj)   //визначення конструктора копіювання
{

      //do something
}
//---------------------------------------------------------------------------
template< class T >
SymbString< T>::~SymbString()     // Визначення деструктора
{
     //do something
}
//---------------------------------------------------------------------------
template< class T >
void SymbString<T>::PutRyadok()     //Введення рядка
{//do something
}
//---------------------------------------------------------------------------


template <class T>
class ComplexString:public SymbString  <T> //похідних клас ... успадкування
{
private:
         double real; // Дійсна частина
         double image; // Уявна частина

public:
        char *com;
        ComplexString<T>::ComplexString();             //конструктор без параметрів
        ComplexString<T>(const char* buf);         //конструктор що приймає С-рядок
        ComplexString(const ComplexString<T> &obj);    //конструктор копіювання
        ComplexString::ComplexString(double real, double image);
        ComplexString<T>::~ComplexString();            //деструктор

        static int countCS;                // статичний член класу

        ComplexString& operator=(const ComplexString &op2);  // перевантаженння оператора =
        ComplexString operator+(ComplexString &OBJ1);  // перевантаженння оператора +
        ComplexString operator-(ComplexString &OBJ1);  // перевантаженння оператора -
        ComplexString operator*(ComplexString &OBJ1);  // перевантаженння оператора *
        ComplexString operator/(ComplexString &OBJ1);  // перевантаженння оператора /
        friend ostream& operator<<(ostream& os, ComplexString& x);// перевантаженння оператора <<
        friend istream& operator>>(istream& is, ComplexString& x);// перевантаженння оператора >>
        ComplexString operator==(ComplexString &op2);  // перевантаженння оператора ==
        void ClearC() { com="\0"; }   //очищення рядка
        void PutComplexString();      // введення рядка
        void ShowCom() { cout << Cyr("Комплексний рядок: ") << com  << endl; } // вивід
        void PutImage(double im) {image=im;}
        void PutReal(double re) {real=re;}
        void Check(char* ctc);       // перевірка
        void Convert (char *ctc);     //перетворення рядка в число


};
//---------------------------------------------------------------------------
template <class T>
int ComplexString<T>::countCS;   //ініціалізація  стат. члену. ; за замовч = 0
template< class T >
ComplexString<T>::ComplexString()     // Визначення конструктора без параметрів
{
    //do something
}
//---------------------------------------------------------------------------
template< class T >
ComplexString<T>::ComplexString(const char* buf)    // конструктор що приймає рядок
{
       //do something
}
//---------------------------------------------------------------------------
template< class T >
ComplexString<T>::~ComplexString<T>()       // Визначення деструктора
{
       //do something
}
//---------------------------------------------------------------------------
template< class T >
ComplexString<T>::ComplexString(const ComplexString &obj)   //визначення конструктора копіювання похідного класу
{
      //do something
}
//---------------------------------------------------------------------------
template< class T >
ComplexString<T>::ComplexString(double real, double image)    // конструктор що приймає два числа
{
       //do something
}

//----------------------------------------------------------------------------
template< class T >
void ComplexString<T>::PutComplexString()   // Введення комплексного числа
{
      //do something
}
//---------------------------------------------------------------------------
template< class T >
void ComplexString<T>::Convert(char *ctc)
{
//do something
}

//----------------------------------------------------------------------------
template< class T >
void ComplexString<T>::Check(char* ctc)   // перевірка
{//do something
}
//---------------------------------------------------------------------------


//-----------------------------------------
template< class T >
ComplexString<T> ComplexString<T>::operator+(ComplexString<T>& obj)   //Перевантаження оператора +
{                                               //додавання комплексних рядків
    //do something
}

//----------------------------------------------
template< class T >

ComplexString <T>ComplexString<T>::operator-(ComplexString &fp1)   //Перевантаження оператора -
{
    //do something

}
template< class T >
ComplexString <T>ComplexString<T>::operator*(ComplexString &fp1)   //Перевантаження оператора *
{//do something
}
template< class T >
ComplexString<T> ComplexString<T>::operator/(ComplexString &fp1)            //Перевантаження оператора /
    {
      //do something
    }

template< class T >
ostream& operator<<(ostream& os, ComplexString<T>& x)   //Перевантаження оператора <<
{
      //do something

}
template< class T >
istream& operator>>(istream& is, ComplexString<T>& x )   //Перевантаження оператора >>
{
       //do something
}

//---------------------------------------------------------------------------

//Перевантаження оператора присвоєння "=".
template< class T >
ComplexString<T>& ComplexString<T>::operator=(const ComplexString& op2)
{
  //do something
}


//---------------------------------------------------------------------------

// Перевантаження оператора порівняння "==".
template< class T >
ComplexString<T> ComplexString<T>::operator==(ComplexString &op2)
{
//do something
}
//---------------------------------------------------------------------------
// оголошенння функцій
int Menu(), Op1(), Op2(), SubMenu1(), SubMenu2();

void ShowSub1(), ShowSub2();
template <class T>
void OperateS(SymbString<T> &obj);
template <class T>
 void OperateC(ComplexString<T> &obj);

//---------------------------------------------------------------------------
int main()      // головна програма
{//do something
}

//---------------------------------------------------------------------------
int Menu()    // Отримання команди головного меню, вибраної користувачем.
{      //do something
}
//---------------------------------------------------------------------------
template <class T>
void OperateS(SymbString<T> &obj)    // Опрацювання рядка базового класу
{//do something
}
//---------------------------------------------------------------------------
template <class T>
void OperateC(ComplexString<double> &obj)    // Опрацювання рядка похідного класу
{
      
}
//---------------------------------------------------------------------------

int Op1()   // Робота з рядком базового класу.
{
       //do something
}
//---------------------------------------------------------------------------

int Op2()  // Робота з рядком базового класу.
{
    //do something
}
//---------------------------------------------------------------------------

int SubMenu1()    // Отримання команди під меню, вибраної користувачем.
{
        char ch;
        cout << endl;
        do {
                cout << Cyr("Кiлькiсть викликiв конструктора копiювання: ") << SymbString<T>::countSS << endl << endl;
                cout << "------------------------------------------" << endl;
                cout << Cyr("  (K) - Конструктор без параметрiв.") << endl;
                cout << Cyr("  (R) - Конструктор що приймає С-рядок.") << endl;
                cout << Cyr("  (S) - Конструктор що приймає символ.") << endl;
                cout << Cyr("  (C) - Конструктор копiювання.") << endl;
                cout << Cyr("  (B) - вийти з меню.") << endl;
                cout << "------------------------------------------" << endl;
                cout << Cyr("Введiть команду: ");
                cin >> ch;
        } while (!strchr("krscb", tolower(ch)));
        return tolower (ch);
}
//---------------------------------------------------------------------------

void ShowSub1() // Отримання команди під меню, вибраної користувачем.  Символьний рядок
{
        char choose;
        for( ; ; ) {
                choose = SubMenu1(); // Отримання команди меню, вибраної користувачем.
                switch (choose)
                {
                        case 'k':
                                {   //виклик конструктора без параметрів
                                SymbString <T>Ob;
                                Ob.Show();
                                OperateS(Ob);
                                break;
                                }
                        case 'r':
                                {  //виклик конструктора що прийимає рядок
                                cout << Cyr("Введiть рядок: ");
                                char s[size];
                                //cin.get(s,size);
                                cin >> s;
                                SymbString<T> Ob1(s);
                                OperateS(Ob1);
                                break;
                                }
                        case 's':
                                {   //виклик конструктора що приймає символ
                                cout << Cyr("Введiть символ: ");
                                char s[size];
                                cin >> s;
                                SymbString <T>Ob2(s,1);
                                Ob2.Show();
                                break;
                                }
                        case 'c':
                                {    //окремий виклик конструктора копіювання
                                SymbString <T>Ob("copy");
                                SymbString <T>OB = Ob;
                                OB.Show();
                                break;
                                }
                        case 'b': return;
                        default: cout << Cyr("Ви повиннi ввести одну з букв: K, R, S, C, B") << endl;
                }
        }
}
//---------------------------------------------------------------------------

int SubMenu2()    // Вивід меню для початку роботи з комплексним числом
{
        char ch;
        cout << endl;
        do {
                cout << Cyr("Кiлькiсть викликiв конструктора копiювання: ") << ComplexString<T>::countCS << endl << endl;
                cout << "------------------------------------------" << endl;
                cout << Cyr("  (K) - Конструктор без параметрiв.") << endl;
                cout << Cyr("  (R) - Конструктор що приймає С-рядок.") << endl;
                cout << Cyr("  (C) - Конструктор копiювання.") << endl;
                cout << Cyr("  (B) - вийти з меню.") << endl;
                cout << "------------------------------------------" << endl;
                cout << Cyr("Введiть команду: ");
                cin >> ch;
        } while (!strchr("krcb", tolower(ch)));
        return tolower (ch);
}

//---------------------------------------------------------------------------

void ShowSub2()  // Отримання команди під меню, вибраної користувачем. Комплексне число
{
     
}
//---------------------------------------------------------------------------







осталось две ошибки

  [Linker Error] Unresolved external 'void OperateC<T>(ComplexString<T>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ
  [Linker Error] Unresolved external 'void OperateC<double>(ComplexString<double>&)' referenced from D:\КУРСОВА БРИНДАС\LAST\UNIT1.OBJ

помогите, плз 
PM MAIL   Вверх
borisbn
Дата 10.5.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(tarasrng @  10.5.2012,  19:01 Найти цитируемый пост)
template <class T>
void OperateC(ComplexString<double> &obj) 

ничего в глаза не бросается ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 11.5.2012, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



borisbn, 
исправил. 
теперь вот здесь например 
Код

                                ComplexString<double> plus;
                                ComplexString<double> tmp;
                                obj.Check(obj.com);
                                obj.Convert(obj.com);
                                cin >> plus;
                                cout<<obj<<"+"<<plus<<"=";
                                tmp = obj+plus;
                                cout<<tmp;
                                break;


[C++ Error] Unit1.cpp(550): E2094 'operator+' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
я же шаблон сделал, чтобы потом работать например с типом double, или int, почему ошибки то?
вот оператор +
Код

template< class T >
ComplexString<T> ComplexString<T>::operator+(ComplexString<T>& obj)   
      ComplexString<T> tmp;

      tmp.real = real+obj.real;
      tmp.image = image+obj.image;

    return tmp;

}


аналогично здесь ругаеться на минус 
Код

ComplexString <double> minus;
                                ComplexString<double> tmp;
                                obj.Check(obj.com);
                                obj.Convert(obj.com);
                                cin >> minus;
                                tmp=obj-minus;
                                cout<<obj<<"-"<<minus<<"="<<tmp;
                                break;


[C++ Error] Unit1.cpp(562): E2094 'operator-' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
и на умножение, и деление
а на присвоение 
Код

                                obj.Check(obj.com);
                                obj.Convert(obj.com);
                                ComplexString <double>Ch;
                                cin >> Ch;
                                Ch==obj;
                                break;

вот так говорит:
[C++ Error] Unit1.cpp(598): E2094 'operator==' not implemented in type 'ComplexString<double>' for arguments of type 'ComplexString<T>'
извените за ламерство, я на java програмирую, с++ знаю, но с шаблонами крайне плохо знаком. помогите пожалуйста разобраться.
PM MAIL   Вверх
bsa
Дата 11.5.2012, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
template< class T >
ComplexString <T>ComplexString<T>::operator*(ComplexString &fp1)   //Перевантаження оператора *
{//do something
}
замени на
Код
template<class T>
ComplexString<T> ComplexString<T>::operator*(const ComplexString<T> &fp1) const  //Перевантаження оператора *
{//do something
}


Это сообщение отредактировал(а) bsa - 11.5.2012, 00:21
PM   Вверх
tarasrng
Дата 11.5.2012, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 11.5.2012,  00:20)
Код
template< class T >
ComplexString <T>ComplexString<T>::operator*(ComplexString &fp1)   //Перевантаження оператора *
{//do something
}
замени на
Код
template<class T>
ComplexString<T> ComplexString<T>::operator*(const ComplexString<T> &fp1) const  //Перевантаження оператора *
{//do something
}

заменил. ничего не изменилось. 
[C++ Error] Unit1.cpp(550): E2094 'operator+' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
[C++ Error] Unit1.cpp(562): E2094 'operator-' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
[C++ Error] Unit1.cpp(573): E2094 'operator*' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
[C++ Error] Unit1.cpp(585): E2094 'operator/' not implemented in type 'ComplexString<T>' for arguments of type 'ComplexString<double>'
[C++ Error] Unit1.cpp(598): E2094 'operator==' not implemented in type 'ComplexString<double>' for arguments of type 'ComplexString<T>'

посмотрите файлик плз

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Unit1.cpp 31,21 Kb
PM MAIL   Вверх
borisbn
Дата 11.5.2012, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата
ComplexString<T>::~ComplexString<T>

<T> - лишнее
Цитата
template< class T >
ComplexString<T>::ComplexString(const ComplexString< T > &obj)

а вот тут нужно добавить < T >
Цитата
template< class T >
ComplexString <T>ComplexString<T>::operator-(ComplexString< T > &fp1)

то же самое
Цитата
template< class T >
ComplexString<T> ComplexString<T>::operator/(ComplexString< T > &fp1)

то же самое
Цитата
template< class T >
ComplexString<T>& ComplexString<T>::operator=(const ComplexString< T >& op2)

то же самое

в функции SubMenu1
Цитата
<< SymbString<T>::countSS << endl << endl;

откуда взялось это <T> ???

в функции ShowSub1
Цитата
SymbString <T>Ob;

тот же вопрос

в функции SubMenu2
Цитата
 << ComplexString<T>::countCS << endl << endl;

то же

и т.д. и т.п.

В общем совет такой - отложи программирование/кодирование и почитай какую-нибудь книжку про шаблоны, а то у тебя каша какая-то получается


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 11.5.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



borisbn, спасибо, разобрался, теперь все ок, только на операторах << и >> ругаеться.
Код

 friend ostream& operator<<(ostream& os, const ComplexString<T>& x);
 friend istream& operator>>(istream& is, const ComplexString<T>& x);


Код

template< class T >
ostream& operator<<(ostream& os, const ComplexString<T>& x)  
{
        os << "(" << x.image << "i" << x.real << ")";           
        return os;

}
template< class T >
istream& operator>>(istream& is, const ComplexString<T>& x )   
{
        char s[size];
        cin.getline(s,size) ;
        x.Check(s);
        x.Convert(x.com);
        return is;
}


например здесь
Код

void OperateC(ComplexString<double> &obj)    
{
//...
ComplexString<double> plus;
ComplexString<double> tmp;
obj.Check(obj.com);
obj.Convert(obj.com);
cin >> plus;
cout<<obj<<"+"<<plus<<"=";
//...

ошибка 
[Linker Error] Unresolved external 'operator <<(_STL::basic_ostream<char, _STL::char_traits<char> >&, const ComplexString<double>&)' referenced from D:\ÊÓÐÑÎÂÀ ÁÐÈÍÄÀÑ\LAST\UNIT1.OBJ
и
[Linker Error] Unresolved external 'operator >>(_STL::basic_istream<char, _STL::char_traits<char> >&, const ComplexString<double>&)' referenced from D:\ÊÓÐÑÎÂÀ ÁÐÈÍÄÀÑ\LAST\UNIT1.OBJ

в чем проблема?

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Unit1.cpp 31,32 Kb
PM MAIL   Вверх
borisbn
Дата 11.5.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(tarasrng @  11.5.2012,  11:57 Найти цитируемый пост)
friend ostream& operator<<(ostream& os, const ComplexString<T>& x);
 friend istream& operator>>(istream& is, const ComplexString<T>& x);

так неправильно. сделай так
Код
template< class U > friend ostream& operator<<(ostream& os, const ComplexString<U>& x);
template< class U > friend istream& operator>>(istream& is, /*const*/ ComplexString<U>& x);

и ещё - почему у тебя оператор >> принимает константную ссылку ? он что, не собирается менять эту переменную ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 11.5.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



Цитата(borisbn @ 11.5.2012,  12:48)
Цитата(tarasrng @  11.5.2012,  11:57 Найти цитируемый пост)

friend ostream& operator<<(ostream& os, const ComplexString<T>& x);
 friend istream& operator>>(istream& is, const ComplexString<T>& x);

так неправильно. сделай так
Код
template< class U > friend ostream& operator<<(ostream& os, const ComplexString<U>& x);
template< class U > friend istream& operator>>(istream& is, /*const*/ ComplexString<U>& x);


переделал вот так: 
Код

template< class U > friend ostream& operator<<(ostream& os, const ComplexString<U>& x);
template< class U > friend istream& operator>>(istream& is, ComplexString<U>& x);


Код

template< class U >
ostream& operator<<(ostream& os, const ComplexString<U>& x) 
{
        os << "(" << x.image << "i" << x.real << ")";           
        return os;

}
template< class U >
istream& operator>>(istream& is, ComplexString<U>& x )  
{
        char s[size];
        cin.getline(s,size) ;
        x.Check(s);
        x.Convert(x.com);
        return is;
}


теперь при каждом использовании >> или << ошибка 
[C++ Error] Unit1.cpp(547): E2335 Overloaded 'operator istream & >> <double>(istream &,ComplexString<double> &)' ambiguous in this context
PM MAIL   Вверх
borisbn
Дата 11.5.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



чего-то я уже ничего не понимаю
вот - http://liveworkspace.org/code/b3fbd37eb646...38aad8a82ab93d2 - рабочий код.
создай у себя простенькую программку из десятка строк и подтверди проблему на ней.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 11.5.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



borisbn, спасибо за советы. ваш код без проблем компилируется на visual studio, а c++ быдлер 6 ругаеться. для него я писал так
Код

#include <vcl>

#include <iostream>

using namespace std;

const int size = 30;           

template <class T>
class ComplexString ;

template <class T>
ostream& operator <<(ostream& os, const ComplexString<T>& a);

template<class T>
istream& operator >>(istream& is, ComplexString<T>& a);

template <class T>
class ComplexString
{
private:
         double real; 
         double image; 

public:

        friend ostream& operator<< <T>(ostream& os, const ComplexString<T>& x);
        friend istream& operator>> <T> (istream& is, ComplexString<T>& x);
};
template< class T >
ostream& operator<<(ostream& os, const ComplexString<T>& x)   
{
        os << "(" << x.image << "i" << x.real << ")";         
        return os;
}
template< class T >
istream& operator>>(istream& is, ComplexString<T>& x )   
{
        char s[size];
        cin.getline(s,size) ;
        x.real = 1;
        x.image = 0;
        return is;
}
int main()      
{
ComplexString<double> tmp1;
cin>>tmp1;
cout<<tmp1;
int hjk;
cin>>hjk;
}

теперь все работает.
PM MAIL   Вверх
borisbn
Дата 11.5.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



ну и ладненько... у меня только один мааааааленький вопрос. нафига тебе вообще шаблон, если ты нигде этот T не используешь ?
Цитата
double real;
double image;

real и image у тебя double
Цитата(tarasrng @  10.5.2012,  18:03 Найти цитируемый пост)
ComplexString::ComplexString(double real, double image);

конструктор принимает double...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tarasrng
Дата 11.5.2012, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 8.7.2011

Репутация: нет
Всего: нет



borisbn, 
Код

template< class T >
ComplexString<T>::ComplexString(T real, T image)    // конструктор що приймає два числа
{
        com = new char[size];
        this->real = real;
        this->image = image;
}
 - конструктор уже не принимает double:) 
Код

 T real; 
 T image; 

просто я сначала разобрался хоть немного с шаблонами в с++, я вообще на java пишу, но попросил друг курсак написать на с++, и в задании сказано, чтобы шаблоны были. теперь доделаю все как надо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.