有一種方法來初始化一個數組,像這樣:初始化類對象陣列
static const vec3d<long> XI[Q] = {
vec3d<long>(0, 0, 0),
vec3d<long>(-1, 0, 0), vec3d<long>(0,-1, 0), vec3d<long>(0, 0,-1),
vec3d<long>(-1,-1, 0), vec3d<long>(-1, 1, 0), vec3d<long>(-1, 0,-1), [etc]
};
其中
00039 template<typename TYPE>
00040 class vec3d : public vec<TYPE>{
00041 public:
00042
00049 vec3d() : vec<TYPE>(0, 3){};
00057 vec3d(TYPE right) : vec<TYPE>(right, 3){};
00065 vec3d(TYPE X_val, TYPE Y_val, TYPE Z_val) : vec<TYPE>(0, 3){
00066 this->val[0] = X_val;
00067 this->val[1] = Y_val;
00068 this->val[2] = Z_val;
00069 };
00077 vec3d(vec3d<TYPE>& right) : vec<TYPE>(0, 3){
00078 this->val[0] = right[0];
00079 this->val[1] = right[1];
00080 this->val[2] = right[2];
00081 }; [etc] };
和
00040 template<typename TYPE>
00041 class vec{
00042 public:
00047 TYPE *val;
00052 int dimension;
00053 public:
00060 vec();
00066 vec(TYPE right);
00073 vec(TYPE right, int _dimension);
00081 vec(vec<TYPE> &right);
00082
00087 ~vec();
00088
00089
00090 TYPE& operator[](int right);
00091 vec<TYPE>& operator=(TYPE right);
00092 vec<TYPE>& operator=(vec<TYPE> &right);
[etc] };
來源是:
00049 template<typename TYPE>
00050 vec<TYPE>::vec(TYPE right, int _dimension){
00051 dimension = _dimension;
00052 val = new TYPE[_dimension];
00053 assert(val);
00054 for(int i = 0; i < dimension; i++) val[i] = right;
00055
00056 };
00075 template<typename TYPE>
00076 TYPE& vec<TYPE>::operator[](int right){
00077 assert((right < dimension));
00078 assert(right >= 0);
00079 assert(val);
00080 return val[right];
00081 };
是構造函數。 Q被聲明爲「static const int」,所以它應該滿足C++標準是非變量的,對嗎?
編譯器說: 錯誤:呼叫沒有匹配功能 'ALBM :: vec3d :: vec3d(ALBM :: vec3d)' vec3d.h:77:2:注意:考生:ALBM :: vec3d: :vec3d(albm :: vec3d &)[with TYPE = long int]
顯然有問題,我不能在這裏通過vec3d &。有一些解決方法嗎?首先定義每個單獨的載體似乎是一個解決方案。雖然是一個謎題...
對不起,我的愚蠢問題......也許這個線程存在某處,但我沒有找到它。可能這個問題有一些我不知道的特殊名字 - 因此我不能谷歌它! 「擴展初始化列表」,「一流的數組初始化」和這樣的沒有做的伎倆......
SOLUTION:一些後處理在這裏...也許如此。其他遭遇相同的概率: 拷貝構造函數缺乏一個「常量」:
00077 vec3d(const vec3d<TYPE>& right) : vec<TYPE>(0, 3){
00078 this->val[0] = right.val[0];
00079 this->val[1] = right.val[1];
00080 this->val[2] = right.val[2];
而且我不能訪問權[直接] - 我的猜測是有原因的將是模板式的 - 但right.val []是訣竅!
發佈*最小*和*完整*代碼示例。 –
編輯:希望這有助於? – 0815ZED