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
Öğ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