以下ソースコード、エラー文、仕様書です。
ちなみに内容は自作のvectorクラスとなっております。
ソースコード
► スポイラーを表示
#define _CRT_SECURE_NO_DEPRECATE
#pragma once
namespace fw{
typedef unsigned int uint;
template<typename X>
class vector{
X * cont;
uint Size;
uint Space;
int Perm;
public:
vector(){
cont = new X[256];
Size = 0;
Space = 256;
Perm = false;
}
uint size(){ return Size; }
fw::vector<X> & resize(uint size){
if(size > Size){
if(size > Space){
X * ins = new X[Size];
memcpy(ins, cont, sizeof(X)*Size);
delete [] cont;
cont = new X[size+256];
memcpy(cont, ins, sizeof(X)*Size);
delete [] ins;
Space = size+256;
}
for(uint i=Size;i<size;i++) cont[i] = X();
Size = size;
}
return *this;
}
fw::vector<X> & addsize(uint size){
resize(size+Size);
return *this;
}
fw::vector<X> & operator= (const std::vector<X> & sv){
resize(sv.size() );
Size = sv.size();
for(uint i=0;i<sv.size();i++) cont[i] = sv[i];
return *this;
}
X at(uint index){
uint needSize = index+1;
if(needSize > Size){
if(Perm){
if(Perm==-1) resize(needSize);
else{
if(needSize<=(uint)Perm) resize(needSize);
else delete [] cont;
}
}
else delete [] cont;
}
return cont[index];
}
X & operator[] (uint index){
at(index);
return cont[index];
}
fw::vector<X> & pop(){
Size--;
return *this;
}
fw::vector<X> & add(){
addsize(1);
return *this;
}
fw::vector<X> & add(const X & input){
addsize(1);
cont[Size] = input;
return *this;
}
fw::vector<X> & add(const fw::vector<X> & input) const {
for(uint i=0;i<input.size();i++){
perm();
cont[size()] = input.at(i);
lim();
}
return *this;
}
fw::vector<X> & operator++ (){
add();
return *this;
}
fw::vector<X> operator++ (int){
fw::vector<X> send = *this;
add();
return send;
}
fw::vector<X> & operator+= (const X & input){
add(input);
return *this;
}
fw::vector<X> & operator+= (const fw::vector<X> & input){
add(input);
return *this;
}
fw::vector<X> & operator<< (const X & input){
add(input);
return *this;
}
fw::vector<X> & operator<< (const fw::vector<X> & input){
add(input);
return *this;
}
fw::vector<X> operator+ (const X & target){
fw::vector<X> send = *this;
send.add(target);
return send;
}
fw::vector<X> operator+ (const fw::vector<X> & target){
fw::vector<X> send = *this;
send.add(target);
return send;
}
fw::vector<X> & perm(){
Perm = -1;
return *this;
}
fw::vector<X> & perm(uint limit){
Perm = limit;
return *this;
}
fw::vector<X> & lim(){
Perm = 0;
return *this;
}
~vector(){
delete [] cont;
}
};
}
► スポイラーを表示
------ ビルド開始: プロジェクト: fireworks, 構成: Debug Win32 ------
コンパイルしています...
fireworks.cpp
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(94) : error C2662: 'fw::vector<X>::size' : 'const fw::vector<X>' から 'fw::vector<X> &' へ 'this' ポインタを変換できません。
with
[
X=std::string
]
変換で修飾子が失われます。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(93): クラス テンプレート のメンバ関数 'fw::vector<X> &fw::vector<X>::add(const fw::vector<X> &) const' のコンパイル中
with
[
X=std::string
]
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\path.h(33) : コンパイルされたクラスの テンプレート のインスタンス化 'fw::vector<X>' の参照を確認してください
with
[
X=std::string
]
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(95) : error C2663: 'fw::vector<X>::perm' : 2 オーバーロードに 'this' ポインタのための必要な定義がされていません。
with
[
X=std::string
]
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(96) : error C2662: 'fw::vector<X>::size' : 'const fw::vector<X>' から 'fw::vector<X> &' へ 'this' ポインタを変換できません。
with
[
X=std::string
]
変換で修飾子が失われます。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(96) : error C2662: 'fw::vector<X>::at' : 'const fw::vector<X>' から 'fw::vector<X> &' へ 'this' ポインタを変換できません。
with
[
X=std::string
]
変換で修飾子が失われます。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(97) : error C2662: 'fw::vector<X>::lim' : 'const fw::vector<X>' から 'fw::vector<X> &' へ 'this' ポインタを変換できません。
with
[
X=std::string
]
変換で修飾子が失われます。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\fireworks\hs\vector.h(99) : error C2440: 'return' : 'const fw::vector<X>' から 'fw::vector<X> &' に変換できません。
with
[
X=std::string
]
変換で修飾子が失われます。
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\fireworks\Debug\BuildLog.htm" に保存されました。
fireworks - エラー 6、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
► スポイラーを表示
基本はstd::vectorと同じである。
ユーザーは、resize(),addsize(),add()などの関数によって容量を確保し、添字によって要素にアクセスするという理解で良い。
要素にアクセスする際、そのインデックス番号がユーザーの確保した容量を超えており、かつ自動拡張が許可されていない場合はアプリケーションエラー(範囲外アクセスエラー)が発生する。
尚、全ての要素が連続的かつインデックス番号順にメモリに格納されていることが保証されている。
つまり、インデックス番号0番目の要素が示すアドレスを先頭アドレスとし、通常の配列のように扱うことができる。
~メンバ関数一覧~
●オリジナル
コンストラクタ・・・引数はない
fw::vector<X> & operator= (const std::vector<X> & sv) ・・・ 本家を代入することもできる。
fw::vector<X> & perm(uint size) :
perm は permit の略で"許可する"の意。
現在の容量+指定した容量までの自動拡張が許可される。
自動拡張が許可されている場合、添字によってアクセスした際に、必要なら自動で新しい容量が確保される。
引数は省略することができ、その場合無制限に自動拡張が許可される。
ちなみにデフォルトでは許可されていない。
fw::vector<X> & lim() ・・・ lim は limit の略で"制限する"の意。自動拡張を許可しない設定にする。
fw::vector<X> & addsize(uint size) ・・・ 内部で resize(size()+size) が行われる。
fw::vector<X> & pop() ・・・ 本家pop_back()に同じ。
fw::vector<X> & add() ・・・ 要素1つ分の容量が新しく確保される。領域は要素のデフォルトコンストラクタで初期化される。
fw::vector<X> & add(const X & input) ・・・ 本家push_back()に同じ。
fw::vector<X> & add(const fw::vector<X> & input) ・・・ 指定したvectorの内容が追加される。容量も必要な分確保される。
fw::vector<X> & operator++ () ・・・ add() に同じ。
fw::vector<X> operator++ (int) ・・・ add() に同じ。ただし、返値は add() を行う前のデータである。
fw::vector<X> & operator+= (const X & input) ・・・ add(const X & input) に同じ。
fw::vector<X> & operator+= (const fw::vector<X> & input) ・・・ add(const fw::vector<X> & input) に同じ。
fw::vector<X> & operator<< (const X & input) ・・・ add(const X & input) に同じ。
fw::vector<X> & operator<< (const fw::vector<X> & input) ・・・ add(const fw::vector<X> & input) に同じ。
fw::vector<X> operator+ (const X & target) ・・・ 自分のデータの後に target のデータが追加されたデータが返される。
fw::vector<X> operator+ (const fw::vector<X> & target) ・・・ 自分のデータの後に target のデータが追加されたデータが返される。
●本家と同様
size()
resize()
operator[]
at() //※ただし値が返されるだけ
エラーの原因が私には全くわかりません。
ご教授よろしくお願い致します。