Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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++;来自typedef的模板错误_C++_Visual Studio 2010_Templates_Stl - Fatal编程技术网

C++ C++;来自typedef的模板错误

C++ C++;来自typedef的模板错误,c++,visual-studio-2010,templates,stl,C++,Visual Studio 2010,Templates,Stl,错误来自位于AssocArray外部的type&AssocArray::operator[](键&k)。 我不明白为什么会收到错误消息: error C2143: syntax error : missing ';' before '&' error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 编辑: 我尝试过以下陈述: typedef typename std:

错误来自位于AssocArray外部的
type&AssocArray::operator[](键&k)
。 我不明白为什么会收到错误消息:

error C2143: syntax error : missing ';' before '&'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
编辑:

我尝试过以下陈述:

typedef typename std::pair<key, value> type;

typedef std::pair<key, value> type; 

using type = std::pair<key, value>;
typedef typename std::pair type;
typedef std::对类型;
使用type=std::pair;
它们也不起作用

template <typename key, typename value>
class AssocArray
{
public:
    typedef typename std::pair<typename key, typename value> type;

    bool addItem(key& k, value& v);

    bool isItem(key& k);

    type& operator[] (key& k);
protected:
private:
    std::vector<type> vecData;
};

template <typename key, typename value>
type& AssocArray<key, value>::operator[]( key& k )
{
    auto iter = std::find_if(vecData.begin(), vecData.end(),
        [&](type& param)
    {
        return param.first == key;
    }
    );
    if(vecData.end() != iter)
        return *iter;

    value v;
    vecData.push_back(std::make_pair(k, v));
    return *vecData.rbegin();
}

template <typename key, typename value>
bool AssocArray<key, value>::isItem( key& k )
{
    auto iter = std::find_if(vecData.begin(), vecData.end(),
        [&](type& param)
    {
        return param.first == key;
    }
    );

    return vecData.end() != iter;
}

template <typename key, typename value>
bool AssocArray<key, value>::addItem( key& k, value& v )
{
    if(isItem(k)) return false;

    vecData.push_back(std::make_pair(k, v));
    return true;
}
模板
亚卡雷类
{
公众:
typedef typename std::pair type;
bool附加项(键和k、值和v);
布尔·伊西滕(基普和k);
类型和操作员[](键和k);
受保护的:
私人:
向量向量数据;
};
模板
类型和关联字符::运算符[](键和k)
{
auto iter=std::find_if(vecData.begin(),vecData.end(),
[&](类型和参数)
{
返回param.first==键;
}
);
if(vecData.end()!=iter)
返回*iter;
v值;
vecData.push_-back(std::make_-pair(k,v));
return*vecData.rbegin();
}
模板
布尔·阿萨卡雷::伊西tem(键和键)
{
auto iter=std::find_if(vecData.begin(),vecData.end(),
[&](类型和参数)
{
返回param.first==键;
}
);
返回vecData.end()!=iter;
}
模板
bool ASSOCARAY::附加项(键和k、值和v)
{
如果(isItem(k))返回false;
vecData.push_-back(std::make_-pair(k,v));
返回true;
}

正如n.m.所指出的,您需要这样的东西:

template <typename key, typename value>
AssocArray<key,value>::type& AssocArray<key, value>::operator[]( key& k )
{
    ...
模板
AssocArray::类型和AssocArray::运算符[](键和k)
{
...
或使用C++11:

template <typename key, typename value>
auto AssocArray<key, value>::operator[]( key& k ) -> type &
{
    ...
模板
自动关联:运算符[](键和k)->类型&
{
...

因为
type
是类的一个成员,所以只有当您在类的上下文中时,名称才会被知道,无论是通过限定它还是在指定您正在定义类的一个成员之后才知道。

正如n.m.指出的,您需要这样的东西:

template <typename key, typename value>
AssocArray<key,value>::type& AssocArray<key, value>::operator[]( key& k )
{
    ...
模板
AssocArray::类型和AssocArray::运算符[](键和k)
{
...
或使用C++11:

template <typename key, typename value>
auto AssocArray<key, value>::operator[]( key& k ) -> type &
{
    ...
模板
自动关联:运算符[](键和k)->类型&
{
...

由于
type
是类的一个成员,因此只有当您在类的上下文中时(通过限定它或在指定您正在定义类的一个成员后等待),名称才会被知道。

您有一些多余的
typename
存在。不确定为什么
typedef
不起作用。是吗您尝试了
使用type=std::pair;
?您不应该在类中重新指定模板参数。@Rapptz它也不起作用。
模板类型-…
类型
此时未知。您需要使用完全限定的名称。您有一些冗余的
类型名
存在。不确定原因是什么
类型定义
>不工作。您是否使用了type = STD::对;<代码>?您不应该在类中重新指定模板参数。@ Rapptz也不起作用。<代码>模板类型……<代码> >代码>类型<代码>在此未知。您需要使用一个完全限定的名称。我忘记了尾随返回类型可以做到。还有一个C++。1y选项,仅返回
auto&
…或
decltype(auto)
,如果你真的想迷惑人们的话。只是扩展一下@Vaughn Cato的答案:在
typedef typename…
中不使用完整名称空间时也会发生类似的错误。显然GCC允许这样做,但VC++不允许。我忘了后面的返回类型可以做到这一点。还有一个C++1y选项,即只返回
auto&
。。。。或者
decltype(auto)
,如果你真的想让人困惑的话。只是为了扩展@Vaughn Cato的答案:在
typedef typename…
中不使用完整名称空间时也会发生类似的错误。显然,GCC允许这样做,但VC++没有。