我正在工作(主要是为了学习目的)自己实现元组,我刚遇到一个问题.我有以下代码:
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特性在单独使用时有效.
这是两个测试用例:
> not working code I pasted above
> proof that RemoveReference
works when used alone
我用G 4.6.1,4.5.1和Clang 2.9尝试了这段代码.
这些错误出现的原因是什么?
解决方法:
RemoveReference< T> :: Type是依赖类型,因此您需要在此处添加typename:
Tuple<First, Elems...> & operator=(const Tuple<typename RemoveReference<First>::Type,
typename RemoveReference<Elems>::Type...> & rhs)
可能还有其他地方.
标签:c,c11,variadic-templates 来源: https://codeday.me/bug/20190902/1789307.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。