私はtuple
の独自の実装で(主に学習目的のために)作業していますが、問題が発生しました。 (それらの多くがありますが、これは不可欠です)、エラー、次の原因バリデーショナルテンプレートと "予想されるタイプ"エラー
namespace Rose
{
template<typename T>
struct RemoveReference
{
typedef T Type;
};
template<typename T>
struct RemoveReference<T &>
{
typedef T Type;
};
template<typename... Elems>
class Tuple;
template<typename First, typename... Elems>
class Tuple<First, Elems...>
{
public:
Tuple(First a, Elems... more)
: More(more...), Element(a)
{
}
Tuple<First, Elems...> & operator=(const Tuple<RemoveReference<First>::Type,
RemoveReference<Elems>::Type...> & rhs)
{
this->Element = rhs.Element;
this->More = rhs.More;
return *this;
}
private:
Tuple<Elems...> More;
First Element;
};
template<typename Only>
class Tuple<Only>
{
public:
Tuple(Only a) : Element(a)
{
}
Tuple<Only> & operator=(const Tuple<RemoveReference<Only>::Type> & rhs)
{
this->Element = rhs.Element;
return *this;
}
private:
Only Element;
};
}
int main()
{
Rose::Tuple<int, float, int> t(1, 1.f, 2);
}
:私は、次のコードしている
error: type/value mismatch at argument 1 in template parameter list for 'template struct Rose::Tuple' error: expected a type, got 'Rose::RemoveReference::Type'
は、私は本当にについては、この何を理解していません。単独で使用した場合、RemoveReference
形質が機能します。私はG ++ 4.6.1、4.5.1およびクラン++ 2.9でこのコードを試してみました
:
は、ここでは、2つのテストケースです。
これらのエラーが表示される理由は何ですか?
単純な 'typename'を見逃す可能性がありますか? – juanchopanza
パラメータ 'Tuple'のテンプレートパラメータリストを意味しますか? – Griwes
バリデーションのテンプレートのルールはあまりよく分かりませんが、 'Elems'が' typename ... Elems'のときに 'RemoveReference'を実行できることは確かですか? –