2014-11-11 2 views
2

У меня возникли некоторые проблемы с синтаксисом (допущением) относительно объявления функции-члена в специализированной специализации.Шаблон Специализация - функции-члены

У меня есть простой 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, но я действительно хочу этого избежать.

Так где же перепутались? Не стесняйтесь также прокомментировать остальную часть кода (стиль, читаемость, эффективность)

+1

Вам не нужны 'template <> с определениями функций, как раз с классом. Это комментарий, потому что я не уверен на 100%, что это не просто причуда с моим компилятором. – dlf

+0

вы правы, я думал, что мне это нужно из-за 'template ' before 'Stack ' – TheGuyWithStreetCred

ответ

2

Префиксы 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(); 
} 
+0

Спасибо, мужчина, очень признателен :) – TheGuyWithStreetCred

Смежные вопросы