Страница 1 из 1

Помогите с шаблоном класса

Добавлено: 01 май 2014, 13:19
Ванно
Создан класс векторов, когда были векторы типа double все работало нормально, попытался сделать шаблон класса, выдает следующую ошибку: "Ошибка 1 fatal error C1001: Внутренняя ошибка в файле компилятора. c:\users\тимофеев\desktop\дз\оп\проекты\vectory\vectory\vector.h 21"
1>------ Построение начато: проект: Vectory, Конфигурация: Debug Win32 ------
1>Компиляция...
1>Vectory.cpp
1>c:\users\тимофеев\desktop\дз\оп\проекты\vectory\vectory\vector.h(21) : fatal error C1001: Внутренняя ошибка в файле компилятора.
1>(файл компилятора "msc1.cpp", строка 1411)
1> Чтобы обойти эту неполадку, попытайтесь упростить или изменить программу в строках около указанной позиции.
1>Для получения дополнительных сведений выберите команду "Техническая поддержка"
1>в меню "Справка" Visual C++ или откройте файл справки технической поддержки.
1> c:\users\тимофеев\desktop\дз\оп\проекты\vectory\vectory\vector.h(134): см. ссылку на создание экземпляров класса шаблон при компиляции "vector<T>"
1>Журнал построения был сохранен в "file://c:\Users\Тимофеев\Desktop\дз\оп\Проекты\Vectory\Vectory\Debug\BuildLog.htm"
1>Vectory - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Код: Выделить всё

 #pragma once
#include <iostream>

using namespace std;
template <class T>
class vector
{private:	
	T *mas;
	int size;
public:
	~vector(){delete[] mas;};
	vector::vector (int _size)
{mas=new T[_size];
if (mas==NULL) cout << "Ошибка! Не хватает памяти"<< endl;
size=_size;
for (int i=0; i<size; i++)
	mas[i]=0;
}

vector::vector (const vector<T>& v)
{
	size=v.size;
mas=new T[size];
for (int i=0;i<size;i++)
	mas[i]=v.mas[i];
}

vector<T>& vector: :o perator=(const vector<T>& v)
{if (this!=&v)
	{if (size!=v.size)
		{size=v.size;
		delete[] mas;
		mas=new T[size];}
	for(int i=0;i<size;i++)
		mas[i]=v.mas[i];}
return *this;
}

vector<T> vector: :o perator+(const vector<T>& v)
{vector<T> tmp(v.size);
	for(int i=0;i<size;i++)
		tmp.mas[i]=v.mas[i]+mas[i];
return tmp;
}

vector<T> vector: :o perator-(const vector<T>& v)
{vector<T> tmp(v.size);
	for(int i=0;i<size;i++)
		tmp.mas[i]=mas[i]-v.mas[i];
return tmp;
}

vector<T>& vector: :o perator+= (const vector<T>& v)
{for(int i=0;i<size;i++)
	mas[i]+=v.mas[i];
return *this;
}

vector<T>& vector: :o perator-= (const vector<T>& v)
{for(int i=0;i<size;i++)
	mas[i]-=v.mas[i];
return *this;
}

vector<T> vector: :o perator + (T num)
{vector<T> tmp=*this;
	for (int i=0;i<size;i++)
		tmp.mas[i]+=num;
return tmp;
}

vector<T> vector: :o perator - (T num)
{vector<T> tmp=*this;
	for (int i=0;i<size;i++)
		tmp.mas[i]-=num;
return tmp;
}

vector<T> operator+(T num, const vector<T>& v)
{vector<T> tmp=v;
	for (int i=0;i<v.size;i++)
		tmp.mas[i]+=num;
return tmp;
}

vector<T> operator-(T num, const vector<T>& v)
{vector<T> tmp=v;
	for (int i=0;i<tmp.size;i++)
		tmp.mas[i]=num-v.mas[i];
return tmp;
}

ostream& operator << (ostream& Stream, const vector<T>& v)
{Stream << "(";
	for (int i=0;i<v.size;i++)
		Stream <<   v.mas[i]	<<";";
		Stream << ");" << endl;
return Stream;
}

istream& operator >>(istream& Stream, vector<T>& v)
{for(int i=0;i<v.size;i++)
	Stream >> v.mas[i];
return Stream;
}

T vector: :o perator* (const vector<T>& v)
{T tmp=0;
	for(int i=0;i<size;i++)
		tmp+=mas[i]*v.mas[i];
return tmp;
}

vector<T> vector: :o perator* (T num)
{vector<T> tmp=*this;
	for (int i=0;i<size;i++)
		tmp.mas[i]*=num;
return tmp;
}

vector<T>& vector: :o perator*= (T num)
{for (int i=0;i<size;i++)
		mas[i]*=num;
return *this;
}

vector<T> operator* (T num, const vector<T>& v)
{vector<T> tmp=v;
	for (int i=0;i<v.size;i++)
		tmp.mas[i]*=num;
return tmp;
}
	T operator[] (int i) {return mas[i];}
}; 

Помогите разобраться в чем проблема, за ранее спасибо.

Re: Помогите с шаблоном класса

Добавлено: 05 май 2014, 11:57
Romeo
Самописное объявление vector конфликтует со стандартным vector из STL.

Пути решения проблемы:
1) Переименовать самописный вектор (например в Vector)
2) Убрать using namespace std, тогда конфликт будет устранён, так как STL-вский вектор будет останется в неймспейсе std.