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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Объясните пожалуйста что делает функция http://www.cyberforum.ru/cpp-beginners/thread607726.html
и если это какая то формула, то можно ссылку на неё int letterFromNumber(int number, int index, int n) { int num = number / (int)pow((double)n,index); return num % n; }
C++ inline функции vs инструкции inline функций Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т. к. inline функции быстрее обычных. Но как я понимаю, inline функции все равно работают медленнее, чем их инструкции, вставленные на место их вызова. Так ли это? И каким образом создаются локальные переменные inline функций, ведь в стеке нового блока при их... http://www.cyberforum.ru/cpp-beginners/thread607722.html
Различие глобальной и глобальной статической переменной C++
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других хейдеров и с++ файлов . когда там описаны переменные без оператора static линковщик выдаёт ошибку что это переменная объявлена там то там то. если static стоит , то такой проблемы не возникает. в чём различие при объявление глобальной и глобальной статической переменной?
Функционально-подобные макросы C++
Есть переменная std::string Log; и есть другие переменные, или параметры функции. Например, int x; int y; Можно ли написать макрос, заменяющий Log<<LOG(x); на Log<<"<x>"<<std::endl<<"<value>"<<x<<"</value>"<<std::endl<<"<adress>"<<(void *)&x<<"</adress>"<<std::endl<<"</x>"<<std::endl;, а Log<<LOG(y); на Log<<"<y>"<<std::endl<<"<value>"<<y<<"</value>"<<std::endl<<"<adress>"<<(void...
C++ Деление комплексных чисел http://www.cyberforum.ru/cpp-beginners/thread607690.html
Вот код #include <iostream> #include <math> using namespace std; typedef struct { float re, im; } cmplx; cmplx cmplx_div( cmplx c, cmplx d ){ float r, p; cmplx res;
C++ Контроль ошибок при вводе Появился такой вопрос..как проконтролировать пользователя чтоб тот не вводил где не надо символы. if(cin.fail()) cout<<"Только число!\n"; попробывал по такому принципу не получилось..может кто подскажет как лучше всего реализовать данный вопрос?) подробнее

Показать сообщение отдельно
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
18.06.2012, 13:51  [ТС]     <Template>. Ошибка компиляции
Ребят помоги добить прогу) короче все работает нормальное если закоментить 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 !
 
Текущее время: 21:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru