PDA

Tam Sürümünü Görmek İçin : fixed_vector sınıfımda hata


depones
18/02/2008, 00:31
Merhaba,

Öğrenim amaçlı bir fixed_vector sınıfı yazdım. Bu sınıf ile aşağıdaki işlemi gerçekleştirmek istiyorum:

fixed_vector<short, 10> sfv;
fixed_vector<int, 5> ifv(sfv);

sfv ile ifv nesneleri aynı türden olmadıkları için ikinci satırda ifv'nin copy-constructor'ı çağrılmayacak. Bunun yerine gerekli dönüşümü gerçekleştirecek template bir fonksiyon yazdım. Hata template fonksiyon yerine sınıfta başka bir yerden de kaynaklanıyor olabileceği için tüm sınıf kodunu aşağıya koyuyorum. Aldığım hata mesajı: C2440: 'return': cannot convert from 'const short[10]' to 'short *const'. Hata mesajına tıkladığımda IDE aşağıda koyu olarak belirttiğim satırı göstermekte. Hatanın sebebi ve çözümü konusunda yardımcı olursanız memnun olurum.

İyi çalışmalar.


#ifndef _FIXEDVECTOR_HPP_
#define _FIXEDVECTOR_HPP_

#include <cstdio>
#include <algorithm>


template <typename T, size_t capacity>
class fixed_vector {
T m_vd[capacity];
size_t m_size;

public:
typedef T* iterator;
typedef const T* const_iterator;

fixed_vector()
{
m_size = 0;

for (int i = 0; i < capacity; ++i)
m_vd[i] = 0;
}

fixed_vector(const fixed_vector &r)
{
m_size = 0;

std::copy(r.begin(), r.end(), this->begin());
}

fixed_vector<T, capacity> &operator=(const fixed_vector &r)
{
std::copy(r.begin(), r.end(), this->begin());

return *this;
}

template <typename U, size_t ucapacity>
fixed_vector(const fixed_vector<U, ucapacity> &r)
{
m_size = 0;

std::copy(r.begin(), r.begin() + std::min(capacity, ucapacity), this->begin());
}

template <typename U, size_t ucapacity>
fixed_vector<T, capacity> &operator=(const fixed_vector<U, ucapacity> &r)
{
std::copy(r.begin(), r.begin() + std::min(capacity, ucapacity), this->begin());

return *this;
}

iterator begin() {return m_vd;}
iterator end() {return m_vd + capacity;}
const iterator begin()const {return m_vd;}
const iterator end()const {return m_vd + capacity;}

size_t size()const {return capacity;}

fixed_vector<T, capacity> &push_back(T val)
{
if (m_size >= capacity) {
fprintf(stderr, "Cannot enlarge fixed capacity vector!..");
return *this;
}

m_vd[m_size++] = val;

return *this;
}

friend std::ostream &operator<<(std::ostream &os, fixed_vector<T, capacity> &r)
{
for (size_t i = 0; i < r.size(); ++i)
os << r.m_vd[i] << " ";

return os;
}

};

#endif


acehreli
18/02/2008, 01:02
Derelenebilmesi icin iki sey gerekti:

1) int yerine size_t (ama asil sorun bu degildi):


for (size_t i = 0; i < capacity; ++i)


2) 'const iterator' yerine 'const_iterator':

const_iterator begin()const {return m_vd;}
const_iterator end()const {return m_vd + capacity;}


Ali

depones
18/02/2008, 01:06
Teşekkür ederim acehreli. Bunun gibi küçük hataların bazen dikkatimden kaçıp sonra beni çok uğraştırdığı oluyor.

İyi çalışmalar.