У меня возникли некоторые проблемы с синтаксисом (допущением) относительно объявления функции-члена в специализированной специализации.Шаблон Специализация - функции-члены
У меня есть простой 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
, но я действительно хочу этого избежать.
Так где же перепутались? Не стесняйтесь также прокомментировать остальную часть кода (стиль, читаемость, эффективность)
Вам не нужны 'template <> с определениями функций, как раз с классом. Это комментарий, потому что я не уверен на 100%, что это не просто причуда с моим компилятором. – dlf
вы правы, я думал, что мне это нужно из-за 'template' before 'Stack ' –
TheGuyWithStreetCred