Я работаю (в основном в учебных целях) над собственной реализацией 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);
}
Что вызывает следующую ошибку (их больше, но это важно):
ошибка: несоответствие типа/значения в аргументе 1 в списке параметров шаблона для 'template struct Rose::Tuple' ошибка: ожидался тип, получено 'Rose::RemoveReference::Type'
Я не очень понимаю, о чем это. Черта RemoveReference
работает, когда используется отдельно.
Вот два теста:
Я пробовал этот код с G++ 4.6.1, 4.5.1 и Clang++ 2.9.
В чем причина появления этих ошибок?
typename
? - person juanchopanza   schedule 28.04.2012Tuple
s списки параметров? - person Griwes   schedule 28.04.2012RemoveReference<Elems>
, когдаElems
равноtypename... Elems
? - person Seth Carnegie   schedule 28.04.2012...
после всего выражения. - person Griwes   schedule 28.04.2012Tuple<Only> & operator=(const Tuple<typename RemoveReference<Only>::Type> & rhs)
для вложенного типа? - person AJG85   schedule 28.04.2012A<int, int, float>
, а определение класса —template<typename... Args> class A {...};
, тоArgs...
, используемый в качестве списка параметров шаблона, становитсяint, int, float
. - person Griwes   schedule 28.04.2012RemoveReference<>::Type
? Похоже, вы пытаетесь рассматриватьint, int, float
как один тип, чтобы удалить из них&
. ИRemoveReference<>::Type
это только один тип, не так ли? - person Seth Carnegie   schedule 28.04.2012RemoveReference<Elems>::Type...
(например,Elems
равноint, int, float
) становитсяRemoveReference<int>::Type, RemoveReference<int>::Type, RemoveReference<float>::Type
. - person Griwes   schedule 28.04.2012...
перед ним и основанное на пакете имен типов в несколько выражений? Это круто и удобно. - person Seth Carnegie   schedule 28.04.2012