C++ C++;来自typedef的模板错误
错误来自位于AssocArray外部的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:
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++没有。