C++ 特化一个 vector 的成员函数

标签 c++ templates stl

我是 C++ 新手,正在学习使用模板。 我想创建一个带有 2 个模板参数的模板类,并从类中专门化一个成员函数,以应对第二个模板参数是在第一个参数的指针类型上模板化的 vector 的情况。我认为我尝试过的一个例子会更清楚:

//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 容器、 vector 或列表。例如:

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

我哪里错了?

最佳答案

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

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

foo() 函数 没有重载和重新定义。重新定义 foo() 函数也会报错。您不能根据返回类型重载函数。 std::vector 的特化不正确。 << operator 也应该被重载 你不能像这样直接使用它

cout << container.pop_back();

关于C++ 特化一个 vector 的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22630368/

相关文章:

c++ - 如何检查 map::lower_bound 失败?

C++ 真正简单的 LRU 缓存的最佳容器

c++ - 从 std::multimap 删除元素时的特殊行为

c++ - 获取 boost.log 记录器的严重性..?

C++文本分隔和计数单词

c++ - std::assert 发生了什么

c++ - 纯虚方法的模板特化

c++ - 使用 sdl_mixer 生成音调在 ubuntu 12.04 64 位中因段错误而退出

c++ - 组合多个类模板特化

css - Jekyll 和 SinglePaged 主题