C++ 可变模板和;应为“类型”;错误
我正在自己实现C++ 可变模板和;应为“类型”;错误,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我正在自己实现tuple,我刚刚遇到了一个问题。我有以下代码: namespace Rose { template<typename T> struct RemoveReference { typedef T Type; }; template<typename T> struct RemoveReference<T &> { typedef T Type;
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);
}
名称空间玫瑰
{
模板
结构删除引用
{
T型;
};
模板
结构删除引用
{
T型;
};
模板
类元组;
模板
类元组
{
公众:
元组(第一个a,元素…更多)
:更多(更多…),元素(a)
{
}
元组和运算符=(常量元组和rhs)
{
此->元素=rhs.元素;
这->更多=rhs.More;
归还*这个;
}
私人:
元组更多;
第一要素;
};
模板
类元组
{
公众:
元组(仅a):元素(a)
{
}
元组和运算符=(常量元组和rhs)
{
此->元素=rhs.元素;
归还*这个;
}
私人:
唯一元素;
};
}
int main()
{
玫瑰:元组t(1,1.f,2);
}
这会导致以下错误(有更多错误,但这一个是必要的):
错误:“template struct Rose::Tuple”的模板参数列表中参数1的类型/值不匹配
错误:应为类型,但得到“Rose::RemoveReference::type”
我真的不明白这是怎么回事。单独使用时,RemoveReference
trait有效
以下是两个测试用例:
RemoveReference::Type
是一个依赖类型,因此需要在此处添加typename
:
Tuple<First, Elems...> & operator=(const Tuple<typename RemoveReference<First>::Type,
typename RemoveReference<Elems>::Type...> & rhs)
元组和运算符=(常量元组和rhs)
可能还有其他地方。你可能缺少一个简单的
typename
?你的意思是在参数Tuple
s模板参数列表中?@SethCarnegie,这就是为什么我在整个表达式后面放…
。Tuple&operator=(const Tuple&rhs)
用于嵌套类型?@SethCarnegie,不是,在这种特殊情况下,RemoveReference::Type…
(例如,对于Elems
是int,int,float
),它变成了RemoveReference::Type,RemoveReference::Type,RemoveReference::Type
。实际上,它修复了所有错误。看见似乎在尝试其他任何东西之前,我真的必须试着把typename
放在每一个可能的地方。另外,我想你在回答的一开始是指RemoveReference::Type
,而不是tuple::Type
,不是吗?@Griwes,是的,我指的是RemoveReference。谢谢你的更正。