模板专业化-成员函数

Template Specialization - member functions

本文关键字:成员 函数 专业化      更新时间:2023-10-16

关于模板专用化中成员函数的声明,我在语法(假设)方面遇到了一些问题。

我有一个简单的class Stack,除了string的之外,它对每种类型都一视同仁

这就是我目前拥有的

//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文件中声明了成员函数的解决方案,但我确实希望避免这种情况。

那哪里搞砸了?也可以随意评论代码的其余部分(风格、可读性、效率)

函数定义不需要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();
}