C++ 模板专门化-成员函数
关于模板专门化中成员函数的声明,我在语法(假设)方面遇到了一些问题 我有一个简单的C++ 模板专门化-成员函数,c++,templates,specialization,C++,Templates,Specialization,关于模板专门化中成员函数的声明,我在语法(假设)方面遇到了一些问题 我有一个简单的类堆栈,除了字符串s之外,它对每种类型都一视同仁 这就是我目前所拥有的 //stack.h #ifndef STACK_H #define STACK_H #include <vector> #include <deque> #include <string> template <typename T> class Stack { public: voi
类堆栈
,除了字符串
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();
}
//stack.h
#ifndef堆栈
#定义堆栈
#包括
#包括
#包括
模板
类堆栈{
公众:
无效推力(T常数&);
void pop();
私人:
标准:向量元素;
};
/*模板专门化*/
模板
类堆栈{
公众:
无效推送(标准::字符串常量&s);
void pop();
私人:
std::deque_elems;
};
#包括“stack.tpp”
#endif//STACK_H
//stack.tpp
#包括
模板
无效堆栈::推送(T常量和T)
{
_元素推回(t);
}
模板
void Stack::pop()
{
if(!\u elems.empty())
_元素pop_back();
}
模板
void Stack::push(std::string const&s)
{
_元素推回;
}
模板
void Stack::pop()
{
if(!\u elems.empty())
_元素pop_back();
}
但我得到了错误:用于“void Stack::push(const string&)”的模板id“push”与任何模板声明都不匹配
我发现了一些在.h
文件中声明了成员函数的解决方案,但我确实希望避免这种情况
那你在哪里搞砸了?也可以随意评论代码的其余部分(样式、可读性、效率)函数定义不需要模板
前缀。这应该是您所需要的全部:
void Stack<std::string>::push(std::string const& s)
{
_elems.push_back(s);
}
void Stack<std::string>::pop()
{
if(!_elems.empty())
_elems.pop_back();
}
void Stack::push(std::string const&s)
{
_元素推回;
}
void Stack::pop()
{
if(!\u elems.empty())
_元素pop_back();
}
您不需要带函数定义的模板,只需要带类。这是一个注释,因为我不能100%确定这不仅仅是我的编译器的一个怪癖。你是对的,我认为我需要它是因为模板在堆栈之前