gpt4 book ai didi

c++ - 模板特化 - 成员函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:06 24 4
gpt4 key购买 nike

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

我有一个简单的 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();
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com