テンプレート、入れ子になったクラス、「期待されるコンストラクタ、デストラクタ、または変換前の 『&』トークン」
-
19-09-2019 - |
質問
いくつかのテンプレートで作業し、自分自身にイテレータの基本的なコンテナクラスを書いている間、私は自分自身のスタイルガイドラインに準拠するように別のファイルにテンプレートクラスからメンバ関数の本体を移動する必要が見つかりました。しかし、私は面白いコンパイルエラーに遭遇しました。
runtimearray.cpp:17:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 「&」トークンの前に変換 runtimearray.cpp:24:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 「&」トークンの前に変換 runtimearray.cpp:32:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 「&」トークンの前に変換 runtimearray.cpp:39:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 「&」トークンの前に変換 runtimearray.cpp:85:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 「RuntimeArray」前変換 runtimearray.cpp:91:エラー:予想 コンストラクタ、デストラクタ、またはタイプ 'RuntimeArray'
前変換
runtimearray.hます:
#ifndef RUNTIMEARRAY_H_
#define RUNTIMEARRAY_H_
template<typename T>
class RuntimeArray
{
public:
class Iterator
{
friend class RuntimeArray;
public:
Iterator(const Iterator& other);
T& operator*();
Iterator& operator++();
Iterator& operator++(int);
Iterator& operator--();
Iterator& operator--(int);
bool operator==(Iterator other);
bool operator!=(Iterator other);
private:
Iterator(T* location);
T* value_;
};
RuntimeArray(int size);
~RuntimeArray();
T& operator[](int index);
Iterator Begin();
Iterator End();
private:
int size_;
T* contents_;
};
#endif // RUNTIMEARRAY_H_
runtimearray.cppます:
#include "runtimearray.h"
template<typename T>
RuntimeArray<T>::Iterator::Iterator(const Iterator& other)
: value_(other.value_)
{
}
template<typename T>
T& RuntimeArray<T>::Iterator::operator*()
{
return *value_;
}
template<typename T>
RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator++()
{
++value_;
return *this;
}
template<typename T>
RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator++(int)
{
Iterator old = *this;
++value_;
return old;
}
template<typename T>
RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator--()
{
--value_;
return *this;
}
template<typename T>
RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator--(int)
{
Iterator old = *this;
--value_;
return old;
}
template<typename T>
bool RuntimeArray<T>::Iterator::operator==(Iterator other)
{
return value_ == other.value_;
}
template<typename T>
bool RuntimeArray<T>::Iterator::operator!=(Iterator other)
{
return value_ != other.value_;
}
template<typename T>
RuntimeArray<T>::Iterator::Iterator(T* location)
: value_(location)
{
}
template<typename T>
RuntimeArray<T>::RuntimeArray(int size)
: size_(size),
contents_(new T[size])
{
}
template<typename T>
RuntimeArray<T>::~RuntimeArray()
{
if(contents_)
delete[] contents_;
}
template<typename T>
T& RuntimeArray<T>::operator[](int index)
{
return contents_[index];
}
template<typename T>
RuntimeArray<T>::Iterator RuntimeArray<T>::Begin()
{
return Iterator(contents_);
}
template<typename T>
RuntimeArray<T>::Iterator RuntimeArray<T>::End()
{
return Iterator(contents_ + size_);
}
どのように私はこれらのエラーが離れて行くことができますか?ファイルには、私には意味をなさない、悲しいかな、それはのは、問題と言うのコンパイラです。
解決
私はあなたがtypename
キーワードが欠落していると思います。
例えばます。
template<typename T>
RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator++()
でなければなりません。
template<typename T>
typename RuntimeArray<T>::Iterator& RuntimeArray<T>::Iterator::operator++()
テンプレートパラメータに依存している「ネストされた」タイプは、彼らが、これはそうでない場合はあいまいになるタイプである必要があり、コンパイラに指示するtypename
キーワードを必要とします。
他のヒント
これは面白いスタイルの指針の1つの経糸です。一般に、テンプレート関数の定義は HAVE のヘッダファイルであることを。これは、ほんの数時間前で来た:分割.HPP /の.cppファイルにC ++のクラスをテンプレート化 - ?それが可能であるの
これは、あなたがそれを望むように動作しません。すべてのあなたの関数の宣言はを定義し、はRuntimeArrayを定義している.hファイルに表示されなければなりません。あなたが見ているエラーが何か他のもの、おそらく型名の事かもしれないが、あなたはRunTimeArray.cppが孤立してコンパイルすることができても、誰もそれを使用することはできません。
あなたが本当に別のファイルに定義を持たなければならない場合は、runtimearray.hの終わりにそれを#include