std :: vector和嵌套模板的一些问题 [英] Some problems with std::vector and nested templates

查看:100
本文介绍了std :: vector和嵌套模板的一些问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我正在努力做到以下几点。


#include< vector>

#include< boost / thread / mutex.hpp>

#include< boost / shared_ptr.hpp>

#include< boost / tuple / tuple。 hpp>


class {

boost :: mutex m_lock;

std :: vector< boost :: tuple< uint32_t, boost :: shared_ptr< T>

m_vector;


template< class Tboost :: shared_ptr< Tlist ::< T> getitem(uint32_t id )

{

boost :: mutex :: scoped_lock lock(m_lock);


std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T


> :: iterator pos =



find_if(m_vector.begin(),m_vector.end(),compare_list< T>(id),

m_vector.begin());


if(pos!= m_vector.end())

return * pos;


返回boost :: shared_ptr(NULL);

};


但我收到以下错误

错误:预期'';''在''pos'''之前


我不明白为什么我得到这个错误因为std :: vector的定义

工作,它只是迭代器语句没有' 't。

解决方案

jubelbrus写道:





我正在努力做到以下几点。


#include< vector>

#include< boost / thread / mutex.hpp>

#include< boost / shared_ptr。 hpp>

#include< boost / tuple / tuple.hpp>


class {

boost :: mutex m_lock;

std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T>

m_vector;



我假设uint32_t可能在某个地方被打字。

什么是T?这不是模板吗?


template< class Tboost :: shared_ptr< Tlist ::< T> getitem(uint32_t id)


呵呵?

模板< class T>

boost :: shared_ptr< T>

list< T> :: getitem(uint32_t id)



什么是列表?


{

boost :: mutex :: scoped_lock lock(m_lock);


std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T


>> :: iterator pos =



find_if(m_vector.begin(),m_vector.end(),compare_list< T>(id),

m_vector.begin());



typename std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T


> :: iterator pos = find_if(...)



这里需要typename,因为vector< ...取决于T.


if(pos!= m_vector.end())

return * pos;



* pos是一个元组,而不是shared_ptr


return boost :: shared_ptr(NULL);

};


我收到以下错误

错误:预期'';''在''pos'之前''


我不明白为什么我得到这个错误因为std :: vector的定义

有效,它只是迭代器语句,不是。



-

rbh


对拼写错误感到抱歉...


这就是我要做的事情:

写一个模板类,存储一个boost :: shared_ptr< Twith
$的列表b $ ba索引并且是线程安全的,其中T将是该模板< class T>

stuff ..


我得到了getitem函数编译使用typename,tank ..但是

我发现插入代码存在一些编译问题。


#include< stdint.h>

#include< vector>

#include< boost / thread / mutex.hpp>

#include< boost / shared_ptr.hpp>

#include< boost / tuple / tuple.hpp>


模板< class T>

班级列表{

boost :: mutex m_lock;

std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T>

m_vector ;


uint32_t m_nextid;


uint32_t insert(boost :: shared_ptr< T>);

}


模板< class T>

uint32_t list< T> :: insert(boost :: shared_ptr< T>)

{

typename boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< T

add_item(m_nextid,item);

typename std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T


m_vector;



boost :: mutex :: scoped_lock lock(m_lock);


m_vector.insert(add_item);

返回m_nextid ++;


};


我收到以下错误:

list。 h:在成员函数''uint32_t

stdtools :: list< T> :: insert(boost :: shared_ptr< T>)[with T = int]'':

tester_a.cpp:10:从这里实例化

list.h:90:错误:没有匹配函数来调用

''std :: vector< boost: :tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost: :tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type>,

std :: allocator< boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples: :null_type,boost :: tuples :: null_type


> :: insert(boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< int>,



boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost: :tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type>&)''

/usr/include/c++/4.0.0/bits/vector.tcc:93:注意:候选人是:

typename std :: vector< _Tp,_Alloc> :: iterator std :: vector< _Tp,

_Alloc> :: insert(__ gnu_cxx :: __ normal_iterator< typen ame _Alloc :: pointer,

std :: vector< _Tp,_Alloc,const _Tp&)[with _Tp =

boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: nul l_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type, boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type>,_ Alloc =

std :: allocator< boost: :tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost: :tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type]

/usr/include/c++/4.0.0/bits/stl_vector.h:657:note:

void std :: vector< _Tp,

_Alloc> :: insert(__ gnu_cxx :: __ normal_iterator< typen ame _Alloc :: pointer,

std :: vector< _Tp,_Alloc, size_t,const _Tp&)[with _Tp =

boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost: :tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type>,_ Alloc =

std :: allocator< boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< int>,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type,

boost :: tuples :: null_type,boost :: tuples :: null_type]


任何人?


jubelbrus写道:


对于拼写错误感到抱歉。 ..


这就是我想要做的:

写一个模板类,它存储一个boost :: shared_ptr< Twith
a索引并且是线程安全的,其中T将是该模板< class T>

stuff ..


我得到了getitem功能由usi编译ng typename,坦克..但

我发现插入代码存在一些编译问题。


#include< stdint.h>

#include< vector>

#include< boost / thread / mutex.hpp>

#include< boost / shared_ptr.hpp>

#include< boost / tuple / tuple.hpp>


模板< class T>

班级列表{

boost :: mutex m_lock;

std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T>

m_vector ;


uint32_t m_nextid;


uint32_t insert(boost :: shared_ptr< T>);

}


模板< class T>

uint32_t list< T> :: insert(boost :: shared_ptr< T>)

{

typename boost :: tuples :: tuple< uint32_t,boost :: shared_ptr< T

add_item(m_nextid,item);

typename std :: vector< boost :: tuple< uint32_t,boost :: shared_ptr< T

> m_vector;



boost :: mutex :: scoped_lock lock(m_lock);


m_vector.insert(add_item);



也许你的意思是


m_vector.push_back(add_item);


没有一个名为insert的向量方法只需要一个参数。


john


Hi

I''m trying to do the following.

#include <vector>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/tuple/tuple.hpp>

class {
boost::mutex m_lock;
std::vector<boost::tuple<uint32_t, boost::shared_ptr<T >
m_vector;

template <class Tboost::shared_ptr<Tlist::<T>getitem(uint32_t id)
{
boost::mutex::scoped_lock lock(m_lock);

std::vector< boost::tuple<uint32_t, boost::shared_ptr<T

>::iterator pos =

find_if(m_vector.begin(), m_vector.end(), compare_list<T>(id),
m_vector.begin());

if (pos != m_vector.end())
return *pos;

return boost::shared_ptr(NULL);
};

but I get the following error
error: expected '';'' before ''pos''

I don''t understand why I''m getting this error because the definition
of std::vector works, it''s just the iterator statement that doesn''t.

解决方案

jubelbrus wrote:

Hi

I''m trying to do the following.

#include <vector>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/tuple/tuple.hpp>

class {
boost::mutex m_lock;
std::vector<boost::tuple<uint32_t, boost::shared_ptr<T >
m_vector;

I''m assuming uint32_t might be typedefed somewhere.
What''s T? This is not a template?

template <class Tboost::shared_ptr<Tlist::<T>getitem(uint32_t id)

huh?
template <class T>
boost::shared_ptr<T>
list<T>::getitem(uint32_t id)
?
What''s list?

{
boost::mutex::scoped_lock lock(m_lock);

std::vector< boost::tuple<uint32_t, boost::shared_ptr<T

>>::iterator pos =

find_if(m_vector.begin(), m_vector.end(), compare_list<T>(id),
m_vector.begin());

typename std::vector<boost::tuple<uint32_t, boost::shared_ptr<T

>::iterator pos = find_if(...)

You need typename here, because vector< ... is dependent on T.

if (pos != m_vector.end())
return *pos;

*pos is a tuple, not a shared_ptr

return boost::shared_ptr(NULL);
};

but I get the following error
error: expected '';'' before ''pos''

I don''t understand why I''m getting this error because the definition
of std::vector works, it''s just the iterator statement that doesn''t.

--
rbh


Sorry about the misspellings...

This is what I''m trying to do:
Write a template class that stores a list of boost::shared_ptr<Twith
a index and is thread safe, where T would be that template <class T>
stuff..

I got the getitem function compiling by using typename, tanks.. but
I''ve discovered some compile problems with my insert code.

#include <stdint.h>
#include <vector>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/tuple/tuple.hpp>

template <class T>
class list{
boost::mutex m_lock;
std::vector<boost::tuple<uint32_t, boost::shared_ptr<T >
m_vector;

uint32_t m_nextid;

uint32_t insert(boost::shared_ptr<T>);
}

template <class T>
uint32_t list<T>::insert(boost::shared_ptr<T>)
{
typename boost::tuples::tuple<uint32_t, boost::shared_ptr<T
add_item(m_nextid, item);
typename std::vector<boost::tuple<uint32_t, boost::shared_ptr<T

m_vector;

boost::mutex::scoped_lock lock(m_lock);

m_vector.insert( add_item );
return m_nextid++;

};

I get the following error:
list.h: In member function ''uint32_t
stdtools::list<T>::insert(boost::shared_ptr<T>) [with T = int]'':
tester_a.cpp:10: instantiated from here
list.h:90: error: no matching function for call to
''std::vector<boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>,
std::allocator<boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type

>::insert(boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,

boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>&)''
/usr/include/c++/4.0.0/bits/vector.tcc:93: note: candidates are:
typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp,
_Alloc>::insert(__gnu_cxx::__normal_iterator<typen ame _Alloc::pointer,
std::vector<_Tp, _Alloc, const _Tp&) [with _Tp =
boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>, _Alloc =
std::allocator<boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type]
/usr/include/c++/4.0.0/bits/stl_vector.h:657: note:
void std::vector<_Tp,
_Alloc>::insert(__gnu_cxx::__normal_iterator<typen ame _Alloc::pointer,
std::vector<_Tp, _Alloc, size_t, const _Tp&) [with _Tp =
boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>, _Alloc =
std::allocator<boost::tuples::tuple<uint32_t, boost::shared_ptr<int>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type]

Anybody??


jubelbrus wrote:

Sorry about the misspellings...

This is what I''m trying to do:
Write a template class that stores a list of boost::shared_ptr<Twith
a index and is thread safe, where T would be that template <class T>
stuff..

I got the getitem function compiling by using typename, tanks.. but
I''ve discovered some compile problems with my insert code.

#include <stdint.h>
#include <vector>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/tuple/tuple.hpp>

template <class T>
class list{
boost::mutex m_lock;
std::vector<boost::tuple<uint32_t, boost::shared_ptr<T >
m_vector;

uint32_t m_nextid;

uint32_t insert(boost::shared_ptr<T>);
}

template <class T>
uint32_t list<T>::insert(boost::shared_ptr<T>)
{
typename boost::tuples::tuple<uint32_t, boost::shared_ptr<T
add_item(m_nextid, item);
typename std::vector<boost::tuple<uint32_t, boost::shared_ptr<T

>m_vector;


boost::mutex::scoped_lock lock(m_lock);

m_vector.insert( add_item );

Perhaps you mean

m_vector.push_back( add_item );

There is no method of vector called insert that takes a single argument.

john


这篇关于std :: vector和嵌套模板的一些问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆