Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板和;应为“类型”;错误_C++_C++11_Variadic Templates - Fatal编程技术网

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有效

以下是两个测试用例:

我已经用G++4.6.1、4.5.1和Clang++2.9尝试了这段代码

出现这些错误的原因是什么

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。谢谢你的更正。