c ++专门用于vector的成员函数

时间:2014-03-25 09:32:06

标签: c++ templates stl

我是c ++的新手,我正在学习使用模板。 我想创建一个包含2个模板参数的模板类,并专门化来自类的单个成员函数,以便第二个模板参数是在第一个参数的指针类型上模板化的向量。我想我尝试的一个例子会更清楚:

//Container.h:

template<class T ,   class CONT  >
class Container {

private:
    CONT container;
    T    someData;
public:
    void foo();
};

我试过的std :: vector的说明是:

//Container.cpp

template<class T>
void Container<T, std::vector<T*> > ::foo(){
     cout << "specialized foo:  " << container.pop_back(); 
    }

template<class T, class CONT  >
void Container<T, CONT > ::foo(){
     cout << "regular foo: " << container.pop_back());
}

但我得到了这些错误:

error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C2976: 'Container<T,CONT>' : too few template argument

Container类的用法必须是第一个参数是某种类型,第二个是STL容器,向量或列表。例如:

Container<int, vector<int*> > c;
c.foo();

我错了什么?

2 个答案:

答案 0 :(得分:1)

在类模板中定义成员函数的正确语法是

template<class T, class CONT > 
void Container<T, CONT>::foo()
{
     cout << "specialized foo:" ; 
}

foo()函数未重载并重新定义。重新定义 foo()函数也会出错。您不能在返回类型的基础上重载函数。 std :: vector的特化是不正确的。 &LT;&LT;运算符也应该重载你可以像这样直接使用它

cout << container.pop_back();

答案 1 :(得分:1)

您可以使用基于策略的设计。现在有很多变化,但一个简单的例子是这样的

#include <iostream>
#include <vector>

using namespace std;

template<typename T, class CONT>
struct foo_policy {
    static inline void execute() {
        cout << "regular foo: \n" ;
    }
};

template<typename T>
struct foo_policy<T, std::vector<T*>> {
    static inline void execute() {
        cout << "specialized foo: \n" ;
    }
};

template<class T ,   class CONT  >
class Container
{
private:
    CONT container;
    T    someData;
public:
    void foo()
    {
        foo_policy<T, CONT>::execute();
    }
};

int main() 
{
    Container<int, std::vector<int>>  a;
    Container<int, std::vector<int*>> b;
    a.foo();
    b.foo();
    return 0;
}

Here's a demo。在另一种情况下,您可以从foo_policy类派生Container并使用基本成员的函数(但那里有更复杂的含义)