Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化-成员函数_C++_Templates_Specialization - Fatal编程技术网

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%确定这不仅仅是我的编译器的一个怪癖。你是对的,我认为我需要它是因为
模板
堆栈之前