Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

<Template>. Ошибка компиляции - C++

17.06.2012, 16:11. Просмотров 1279. Ответов 13
Метки нет (Все метки)

Пытаюсь сделать Темплате Array, который бы принимал класс Point. Объект класса Point состоит из 2х точек координаты x и y. Мне надо создавать объект динамически по заданию. Компилятор выдает след ошибку. Код программы ниже. Пожалуйста, подскажите как мне надо переделать код.

log
1> TestArray.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(13): error C2065: 'm_data' : undeclared identifier
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(11) : while compiling class template member function 'Array<Type>::Array(void)'
1> with
1> [
1> Type=Point
1> ]
1> TestArray.cpp(23) : see reference to class template instantiation 'Array<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(30): error C2065: 'm_data' : undeclared identifier
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(26) : while compiling class template member function 'void Array<Type>::SetElement(Type &,int)'
1> with
1> [
1> Type=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(31): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Point' (or there is no acceptable conversion)
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(726): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(764): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(811): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(937): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(944): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(951): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(958): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(968): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,Type>(std::basic_ostream<_Elem,_Traits> &&,_Ty)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> Type=Point,
1> _Ty=Point
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(1085): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(186): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(192): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(199): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(206): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(226): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(260): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(280): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(305): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(325): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(345): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(366): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(386): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(407): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(427): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(447): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(467): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(487): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, Point)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(49): error C2065: 'm_data' : undeclared identifier
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2a\array.cpp(40) : while compiling class template member function 'const Point &Array<Type>::GetElement(int) const'
1> with
1> [
1> Type=Point
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Array.h
// Templated Array class containging 
#include <sstream>
#include <iostream>
 
#ifndef Array_H
#define Array_H
 
template <class Type=double> class Array
{
private:
int m_size; 
 
public:
Array();
Array(int new_size); 
void SetElement(Type& type_object, int index); 
const Type& GetElement(int index) const; 
};
 
 
#ifndef Array_cpp 
#include "array.cpp"
#endif
 
#endif
 
//*********************
 
//array.cpp
#include "array.h"
#include <sstream>
#include <iostream>
using namespace std;
#ifndef Array_CPP
#define Array_CPP
 
template <class Type>
Array<Type>::Array()                                     
{
    m_size = 10;
     m_data = new Type[m_size];
}
 
template <class Type> 
Array<Type>::Array(int new_size)                    
{
    new_size = m_size;
    m_data = new Type[m_size];
}
 
 
template <class Type> 
void Array<Type>::SetElement(Type& type_object, int index)
{
    try
    {
        if (index >= m_size){throw 11;} 
        m_data[index] = type_object;
        cout << "Set Element " << type_object  << endl;
    }
     catch (int x )
     {
        cout << "ERROR" << x << " ignore the set, because index of element bigger then massive size"<< endl;
     }
}
template <class Type> 
const Type& Array<Type>::GetElement(int index) const
{
    try 
    {
        if (index > m_size || index < 0){ throw 1;} 
    } 
    catch (double x)
    {
    cout << "index incorrect, index too big or too small " << x << endl; 
    }  
    return m_data[index];
}
#endif Array_CPP
 
//********************
 
        //main.cpp
        #include <iostream>
        #include <sstream>
        #include "array.h"
        using namespace std;
 
    class Point
{
private:
    double m_x;                                
    double m_y;                                
public:
    // Constructors
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
};
 
 
        int main()
        {
            Point *p1 = new Point (1,12);
                cout << endl; 
            Array<Point> arr1[1];
            arr1[1].SetElement(*p1,0);
                cout << endl;
            arr1[1].GetElement(0) ; 
            delete p1;
            return 0;
        }
Добавлено через 25 минут
мне кажется что в приват для тимплейта надо еще добавить наряду с m_size

C++
1
2
3
private: 
 
Type* m_data;
Еще наверное надо пояснить что хочется чтоб программа выполняла следующее.
1. Создается объекта какого ниб класса
2. Создается типлейт (очень похожий на вектор)
3. Этот объект пихается в этот вектор под индексом ноль или 1 function SetElement
4. И вызову функции GetElement выводит объект на экран.

Пожалуйста помогите !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 16:11     <Template>. Ошибка компиляции
Посмотрите здесь:

Ошибка с template - C++
Доброго всем дня. Не смог толком придумать правильный заголовок, а суть проблемы такая: Есть темплейт функции в отдельном файле,...

Template ошибка компляции - C++
Здравствуйте, есть код, при реализации класса пишет ошибку-невозможно разрешить идентификатор T,U,Z template&lt;class T, class U, class Z&gt; ...

Template, в чем ошибка? - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; using namespace std; template &lt;typename T&gt; void Fill(T matrix, int row,...

Ошибка с template <class T> - C++
Доброго времени суток! Изучаю С++ и не совсем разобрался с template. Вернее, я думаю, что понял, но компилятору виднее. В общем, он...

Ошибка: 'StackIter' is not a template type - C++
Не компилируется. C:\Qt\Qt5.3.2\Tools\QtCreator\bin\ex7\iterator.hpp:31: ошибка: 'StackIter' is not a template type ...

Code::Blocks+template ошибка - C++
#ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED template&lt;class T&gt; class btree { public: ...

Шаблон класса,ошибка TEMPLATE - C++
Вечер добрый,с таким вопросом. Задание: шаблон класса &quot;однонарпавленный линейный список&quot;. И использовать его при составлении программы,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
17.06.2012, 16:39     <Template>. Ошибка компиляции #2
Добавьте в шаблон объявление m_data:
C++
1
2
3
4
5
6
template <class Type=double> class Array
{
private:
    int m_size;
    Type* m_data;
...
И перегрузите в классе Point операцию вывода в поток
После этого откомпилируется.
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
17.06.2012, 17:03  [ТС]     <Template>. Ошибка компиляции #3
Цитата Сообщение от zss Посмотреть сообщение
Добавьте в шаблон объявление m_data:
C++
1
2
3
4
5
6
template <class Type=double> class Array
{
private:
    int m_size;
    Type* m_data;
...
И перегрузите в классе Point операцию вывода в поток
После этого откомпилируется.


Компилятор вроде не ругается больше так сильно... единственное что ошибку выдает
1>------ Build started: Project: HP_4.2a, Configuration: Release Win32 ------
1>TestArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<class Point>::~Array<class Point>(void)" (??1?$Array@VPoint@@@@QAE@XZ)
1>C:\all my\с++\HA level 6\Solution\Level 6\Release\HP_4.2a.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
и какое то дурное сообщение появляется в консоле см приложение
что это ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Array.h
// Templated Array class containging Ts
#include <sstream>
#include <iostream>
 
#ifndef Array_H
#define Array_H
 
template <class Type> class Array
{
private:
Type* m_data;
int m_size; 
 
public:
Array();
Array(int new_size); 
void SetElement(Type& type_object, int index); 
const Type& GetElement(int index) const; 
~Array();
};
 
 
#ifndef Array_cpp 
#include "array.cpp"
#endif
 
#endif
 
//array.cpp
#include "array.h"
#include <sstream>
#include <iostream>
using namespace std;
#ifndef Array_CPP
#define Array_CPP
 
template <class Type>
Array<Type>::Array()                                     
{
    m_size = 10;
     m_data = new Type[m_size];
}
 
template <class Type> 
Array<Type>::Array(int new_size)                    
{
    new_size = m_size;
    m_data = new Type[m_size];
}
 
 
template <class Type> 
void Array<Type>::SetElement(Type& type_object, int index)
{
    try
    {
        if (index >= m_size){throw 11;} 
        m_data[index] = type_object;
        cout << "Set Element " << type_object  << endl;
    }
     catch (int x )
     {
        cout << "ERROR" << x << " ignore the set, because index of element bigger then massive size"<< endl;
     }
}
template <class Type> 
const Type& Array<Type>::GetElement(int index) const
{
    try 
    {
        if (index > m_size || index < 0){ throw 1;} 
    } 
    catch (double x)
    {
    cout << "index incorrect, index too big or too small " << x << endl; 
    }  
    return m_data[index];
}
#endif Array_CPP
 
        //main.cpp
        #include <iostream>
        #include <sstream>
        #include "array.h"
        using namespace std;
 
    class Point
{
private:
    double m_x;                                
    double m_y;                                
public:
    // Constructors
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
    std::string Point::ToString(void) const                // create a string representation of a point
{
// create a string like: “Point(1.5, 3.9)”
      std::ostringstream os;
    os << m_x << " , " << m_y;
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
}
};
 
 
        int main()
        {
            Point *p1 = new Point (1,12);
                cout << endl; 
            Array<Point> arr1[1];
            arr1[1].SetElement(*p1,0);
                cout << endl;
            arr1[1].GetElement(0) ; 
            delete p1;
            return 0;
        }
Миниатюры
<Template>. Ошибка компиляции  
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
17.06.2012, 17:10  [ТС]     <Template>. Ошибка компиляции #4
Еще по задание в main () нужно имплементировать вот такой синтаксис : Array<Point> points(size);
скажите пожалуйста это вообще к чему
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
17.06.2012, 19:11     <Template>. Ошибка компиляции #5
Вы не написали код деструктора
C++
1
2
3
4
5
template <class Type>
Array<Type>::ЁArray()                                     
{
    delete*     m_data;
}
Цитата Сообщение от Leeto Посмотреть сообщение
ще по задание в main () нужно имплементировать вот такой синтаксис : Array<Point> points(size);
скажите пожалуйста это вообще к чему
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
 {
            Point *p1 = new Point (1,12);
            cout << endl; 
            Array<Point> arr1(2);// создали массив, содержащий 2 объекта Point
            arr1.SetElement(*p1,0);// первому элементу присвоили значение p1
                cout << endl;
            p1=arr1.GetElement(0) ; // Прочитали первый элемент 
            delete p1;
            return 0;
        }
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
18.06.2012, 09:36  [ТС]     <Template>. Ошибка компиляции #6
Цитата Сообщение от zss Посмотреть сообщение
Вы не написали код деструктора
C++
1
2
3
4
5
template <class Type>
Array<Type>::ЁArray()                                     
{
    delete*     m_data;
}

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
 {
            Point *p1 = new Point (1,12);
            cout << endl; 
            Array<Point> arr1(2);// создали массив, содержащий 2 объекта Point
            arr1.SetElement(*p1,0);// первому элементу присвоили значение p1
                cout << endl;
            p1=arr1.GetElement(0) ; // Прочитали первый элемент 
            delete p1;
            return 0;
        }

Спасибо больше Сергей Сергеевич )

Добавлено через 8 часов 52 минуты
Цитата Сообщение от Leeto Посмотреть сообщение
Спасибо больше Сергей Сергеевич )
Так не работает код...
p1=arr1.GetElement(0) ;
вот это присвоение оно вообще как ???
У меня даже компилятор его не пропускает
пишет:

1>c:\all my\с++\ha level 6\solution1\level6\42a\main.cpp(39): error C2440: '=' : cannot convert from 'const Point' to 'Point *'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

и кстати на деструктор тоже ругается
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.06.2012, 10:10     <Template>. Ошибка компиляции #7
Leeto, нельзя шаблонные классы разделять на *.h и *.cpp, так как шаблоны раскрываются на этапе компиляции, то линкер потом просто не может найти необходимый инстанс.
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
18.06.2012, 10:53     <Template>. Ошибка компиляции #8
Цитата Сообщение от Leeto Посмотреть сообщение
Так не работает код...
p1=arr1.GetElement(0) ;
проблема в том, что по вызову этой функции нельзя
определить тип шаблона. Указываем явно
p1=arr1.GetElement<Point>(0) ;
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
18.06.2012, 12:03  [ТС]     <Template>. Ошибка компиляции #9
Цитата Сообщение от fasked Посмотреть сообщение
Leeto, нельзя шаблонные классы разделять на *.h и *.cpp, так как шаблоны раскрываются на этапе компиляции, то линкер потом просто не может найти необходимый инстанс.
истанс это типа как объект шаблона УЖЕ запленный необходимым классом ?
или ты имеешь ввиду тольео объект класса ?

Ошибка совсе же не в эту тему о который ты говоришь у меня бы компилятор по другому бы ругался если бы ты был прав...
... можно разделять у меня перед глазами нормально работающий пример, где шаблон в два файла и все ок... мне кажется то о чем ты говоришь решается с помощью прописания пре процессоров, но это так на уровне догатки...

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
проблема в том, что по вызову этой функции нельзя
определить тип шаблона. Указываем явно
p1=arr1.GetElement<Point>(0) ;
нет не работает... по моему уже угадайка началась ((((

ругается на точку arr1. и на <Point>

- 1>c:\all my\с++\ha level 6\solution1\level6\42a\main.cpp(15): error C2275: 'Point' : illegal use of this type as an expression

Добавлено через 14 минут
Эта же ошибка не компеляторская если консоль запускается а ран таймовская... поэтому мне наверное синтаксис тимплейта менять не надо... тут наверное дебагин надо как то что то.... вообще я не знаю...
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
18.06.2012, 12:22     <Template>. Ошибка компиляции #10
Цитата Сообщение от Leeto Посмотреть сообщение
Эта же ошибка не компеляторская если консоль запускается а ран таймовская...
"Компеляторская".

C++
1
*p1 = arr1.GetElement(0);
А в деструкторе наоборот, звёздочка не нужна.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.06.2012, 12:23     <Template>. Ошибка компиляции #11
Цитата Сообщение от Leeto Посмотреть сообщение
истанс это типа как объект шаблона УЖЕ запленный необходимым классом ?
или ты имеешь ввиду тольео объект класса ?
Ошибка совсе же не в эту тему о который ты говоришь у меня бы компилятор по другому бы ругался если бы ты был прав...
... можно разделять у меня перед глазами нормально работающий пример, где шаблон в два файла и все ок... мне кажется то о чем ты говоришь решается с помощью прописания пре процессоров, но это так на уровне догатки...
Я тебе говорю, как правильно делать. Ты же вместо этого инклудишь в заголовочный файл реализации, что вообще смотрится неестественно.
Цитата Сообщение от Leeto Посмотреть сообщение
Так не работает код...
p1=arr1.GetElement(0) ;
вот это присвоение оно вообще как ???
У меня даже компилятор его не пропускает
Ну так смотри, что возвращает метод - константную ссылку. А приемник неконстантный, да еще и указатель.
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
18.06.2012, 13:51  [ТС]     <Template>. Ошибка компиляции #12
Ребят помоги добить прогу) короче все работает нормальное если закоментить try - catch блоки...
если раскоментить то выдает вот такую ошибку

1>------ Build started: Project: 42b, Configuration: Debug Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution1\level6\42b\array.cpp(88): error C2317: 'try' block starting on line '81' has no catch handlers
1> c:\all my\с++\ha level 6\solution1\level6\42b\array.cpp(79) : while compiling class template member function 'void Array<Type>::SetElement(const Type &,int)'
1> with
1> [
1> Type=Point
1> ]
1> c:\all my\с++\ha level 6\solution1\level6\42b\main.cpp(14) : see reference to class template instantiation 'Array<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Line 79 and 88 это лайны для try лупа для SetElement function

last code's edition

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
//array.h
#ifndef Array_H
#define Array_H
 
template <class Type> //Remove the "=double" default parameter.
class Array
{
private:
  int m_size;
  Type* m_data; //m_data should be a pointer, since you want to allocate data to it
 
public:
  Array();
  Array(int new_size);
  Array(const Array<Type>& ar);
  ~Array(); //Don't make your destructor virtual. There is no reason to do it.
  const Type& Array<Type>::GetElement(int index) const;
void Array<Type>::SetElement(const Type& type_object, int index);
  Array<Type>& operator=(const Array& ar); //Const correctness here.
 
  void Swap(Array& ar);  
};
 
//Implementation goes here
 
#endif
 
//point.h
 
#include "array.h"
#include <sstream>
#include <iostream>
using namespace std;
 
 
class Point
{
private:
    double m_x;                                
    double m_y;                                
public:
    // Constructors
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
    std::string Point::ToString(void) const                // create a string representation of a point
{
// create a string like: “Point(1.5, 3.9)”
      std::ostringstream os;
    os << m_x << " , " << m_y;
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
}
};
 
//array.cpp
#include "Array.h"
#include <sstream>
#include <iostream>
#include <exception>
using namespace std;
#ifndef Array_CPP
#define Array_CPP
 
 
template <class Type>
Array<Type>::Array() : m_size(0), m_data(0)
{ }
 
template <class Type>
Array<Type>::Array(int new_size) : m_size(new_size), m_data(new Type[new_size])
{ }
 
template <class Type>
Array<Type>::~Array()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
 
  //Not necessary either, but just to be clean
  m_size = 0;
}
 
template <class Type>
Array<Type>::Array(const Array& ar) : m_data(0), m_size(0)
{
  if(!ar.m_data) {return;}
 
  Array tmp; //Copy construct into another temporary array, this way, if something throws, tmp will clean itself up.
 
  //Create the array
  tmp.m_data = new Type[ar.m_size];
  tmp.m_size = ar.m_size;
 
  //Copy the array elements
  for(int i = 0; i < tmp.m_size; ++i)
    {tmp.m_data[i] = ar.m_data[i];}
 
  //All done! swap into this!
  this->Swap(tmp);
}
 
template <class Type>
Array<Type>& Array<Type>::operator=(const Array& ar)
{
  //Check self assign:
  if(this == &ar) {return *this;}
 
  Array<Type> copy(ar); //Create a copy of ar; If this fails, then *this will not be changed, and nothing will leak
 
  //Succeeded creating copy. Now we can put it inside this
  this->Swap(copy); //And then swap the copy into this!
 
  return *this;
}
 
template <class Type>
void Array<Type>::Swap(Array& ar)
{
  Type* data = m_data;
  int   size = m_size;
  m_data = ar.m_data;
  m_size = ar.m_size;
  ar.m_data = data;
  ar.m_size = size;
}
 
template <class Type> 
void Array<Type>::SetElement(const Type& type_object, int index)
{
    try
    {
        if (index >= m_size || index < 0 )
        { throw std:: out_of_range ("out of range error in void Array<Type>::SetElement");}
        m_data[index] = type_object;
        cout << "Set Element " << type_object  << endl;
    }
    
}
template <class Type> 
const Type& Array<Type>::GetElement(int index) const
{
    
        if (index > m_size || index < 0)
        { throw std::out_of_range ("Out of range error in void Array<Type>::GetElement");} 
 
    return m_data[index];
}
 
#endif //Array_CPP
 
        //main.cpp
        #include "point.h"
        #include <iostream>
        #include <sstream>
        #include "array.cpp"
        #include <exception>
        using namespace std;
 
int main()
        try
        {
            Point *p1 = new Point (1,12);
                cout << endl;
            Array<Point> arr1(5);
            arr1.SetElement(*p1,0);
                cout << endl;
            arr1.GetElement(16) ;
            delete p1;
            return 0;
        }
        catch(const std::exception& e)
        {
            std::cout << e.what() << std::endl;
            throw;
        }
Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
Я тебе говорю, как правильно делать. Ты же вместо этого инклудишь в заголовочный файл реализации, что вообще смотрится неестественно.

Ну так смотри, что возвращает метод - константную ссылку. А приемник неконстантный, да еще и указатель.
"Ты же вместо этого инклудишь в заголовочный файл реализации, что вообще смотрится неестественно." почему не естественно есть такое понятие как inline реализация. В нормальном проекте я мож такого и не сделал бы...
Это учебный проект для того чтобы читабильность повысить я так сделал...

приемник это типа implementation ?

"А приемник неконстантный, да еще и указатель" да все увидел спасибо !
regards !
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.06.2012, 13:51     <Template>. Ошибка компиляции #13
Цитата Сообщение от Leeto Посмотреть сообщение
try
* * {
* * * * if (index >= m_size || index < 0 )
* * * * { throw std:: out_of_range ("out of range error in void Array<Type>::SetElement");}
* * * * m_data[index] = type_object;
* * * * cout << "Set Element " << type_object *<< endl;
* * }
Цитата Сообщение от Leeto Посмотреть сообщение
если закоментить try - catch блоки...
Что-то не видно здесь catch, только try. О чем Вам любезно сообщает компилятор:
Цитата Сообщение от Leeto Посмотреть сообщение
'try' block starting on line '81' has no catch handlers
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2012, 14:22     <Template>. Ошибка компиляции
Еще ссылки по теме:

Ошибка: friend declaration declares a non-template function - C++
Всем доброго времени суток! Я корплю над задачкой: нада сделать класс вектор шаблонным, перегрузить операции ввода-вывода, и тд и тп. ...

Компиляция класса вектор. Ошибка: missing template arguments before «v» - C++
Собственно код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; int...

Ошибка: error C2783: 'T __cdecl sumF(void)' : could not deduce template argument for 'T' - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int a; template&lt; typename T &gt; T sumF() { T s=0; ...

Ошибка "template argument 1 is invalid" - C++
Приветствую! Слабое знание английского не помогло мне найти ответа на stackoverflow, поэтому надеюсь, что кто-нибудь может помочь :) ...

Ошибка "no instance of function template" - C++
В строках 210 и 214 возникает ошибка 7 IntelliSense: no instance of function template &quot;List&lt;datatype&gt;::Sort &quot; matches the argument list ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
18.06.2012, 14:22  [ТС]     <Template>. Ошибка компиляции #14
Цитата Сообщение от fasked Посмотреть сообщение
Что-то не видно здесь catch, только try. О чем Вам любезно сообщает компилятор:
спасибо большое !
Yandex
Объявления
18.06.2012, 14:22     <Template>. Ошибка компиляции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru