模板专业化 - 成员函数

时间:2014-11-11 21:07:43

标签: c++ templates specialization

我在模板专业化中声明成员函数的语法(假设)方面存在一些问题。

我有一个简单的class Stack,除了string s

之外,每种类型都相同

这是我到目前为止所拥有的

//stack.h

#ifndef STACK_H
#define STACK_H
#include <vector>
#include <deque>
#include <string>

template <typename T>
class Stack {

public:
    void push(T const&);
    void pop();

private:
    std::vector<T> _elems;
};

/* template specialization */
template <>
class Stack <std::string>{

public:
    void push(std::string const &s);
    void pop();

    private:
        std::deque<std::string> _elems;
};

#include "stack.tpp"
#endif // STACK_H

//stack.tpp

#include <stdexcept>

template <typename T>
void Stack<T>::push(T const& t)
{
    _elems.push_back(t);
}

template <typename T>
void Stack<T>::pop()
{
    if(!_elems.empty())
        _elems.pop_back();
}

template<>
void Stack<std::string>::push(std::string const& s)
{
    _elems.push_back(s);
}

template <>
void Stack<std::string>::pop()
{
    if(!_elems.empty())
        _elems.pop_back();
}

但我收到错误:template-id 'push<>' for 'void Stack<std::basic_string<char> >::push(const string&)' does not match any template declaration

我找到了一些在.h文件中声明成员函数的解决方案,但我真的想避免这种情况。

那么哪里搞砸了?随意评论其余代码(样式,可读性,效率)

1 个答案:

答案 0 :(得分:2)

函数定义不需要template<>前缀。这应该是你所需要的:

void Stack<std::string>::push(std::string const& s)
{
    _elems.push_back(s);
}

void Stack<std::string>::pop()
{
    if(!_elems.empty())
        _elems.pop_back();
}