Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates - Fatal编程技术网

C++ 获取模板错误

C++ 获取模板错误,c++,templates,C++,Templates,我得到编译错误,请帮助我无法解决它 class A { public : A() {} virtual ~A() {} int getID() { return m_id; } void setID(int id) { m_id = id ; } private: int m_id ; }; class B : public A { };

我得到编译错误,请帮助我无法解决它

 class A {
        public :
        A() {} 
        virtual ~A() {}

        int getID() { return m_id; }
        void setID(int id) { m_id = id ; }

        private:
        int m_id ;
    };    


    class B : public A {

    };


    class C: public A {

    };

    template<class T>
    T* returnObject(vector<T*>& vec, int id)
    {
        for(vector<T*>::iterator itr =vec.begin();  itr != vec.end() ; ++itr)
        {
            if(id == (*itr)->getID()) return (*itr);
        }
        return NULL;
    }

    int main() 
    {
        vector<B*> b1;
        vector<C*> c1;

        B *b = new B();
        b->setID(10);
        b1.push_back(b);
        b = new B();
        b->setID(20);
        b1.push_back(b);
        b = new B();
        b->setID(30);
        b1.push_back(b);

        C *c = new C();
        c->setID(6);
        c1.push_back(c);
        c = new C();
        c->setID(12);
        c1.push_back(c);
        c = new C();
        c->setID(18);
        c1.push_back(c);

        B *bcd = returnObject<B>(b1,30);

        cout<< bcd <<endl ;

        return 0;
    }
A类{
公众:
A(){}
虚拟~A(){}
int getID(){return m_id;}
void setID(int id){m_id=id;}
私人:
国际货币基金组织;
};    
B类:公共A{
};
C类:公共A类{
};
模板
T*returnObject(向量和向量,整数id)
{
对于(vector::iterator itr=vec.begin();itr!=vec.end();++itr)
{
if(id==(*itr)->getID())返回(*itr);
}
返回NULL;
}
int main()
{
载体b1;
向量c1;
B*B=新的B();
b->setID(10);
b1.推回(b);
b=新的b();
b->setID(20);
b1.推回(b);
b=新的b();
b->setID(30);
b1.推回(b);
C*C=新的C();
c->setID(6);
c1.推回(c);
c=新的c();
c->setID(12);
c1.推回(c);
c=新的c();
c->setID(18);
c1.推回(c);
B*bcd=返回对象(b1,30);

cout问题在于
vector::iterator
依赖于模板参数。编译器不知道每个
std::vector
专门化都有一个属于类型的
iterator
成员,因此需要显式声明它是一个类型:

或基于范围的循环:

for (auto&& element : vec)
std::如果
,则查找:

std::find_if(std::begin(vec), std::end(vec), 
            [id](auto&& el){ return id == el->getID() });

虽然
std::find_if
在未找到元素时返回
std::end(vec)
,而不是
NULL

或只使用
auto
。避免了所有的混淆,在这种情况下非常清楚。甚至
for(T*item:vec){/*…*/}
for(auto itr =vec.begin();  itr != vec.end() ; ++itr)
for (auto&& element : vec)
std::find_if(std::begin(vec), std::end(vec), 
            [id](auto&& el){ return id == el->getID() });