Шаблонный аргумент по умолчанию со специализированной функцией-членом - PullRequest
0 голосов
/ 12 мая 2018

У меня есть шаблон класса стек с аргументом шаблона по умолчанию и pop () функция, которая является специализированной функцией-членом

template <typename T,typename CONT = vector<T> >
class Stack
{
public:
 void push(T arg);
 T top()const;
 void pop();
 bool isEmpty() const;
private:
 CONT elems_;
};

template <typename T,typename CONT>
void Stack<T,CONT>::pop()
{
 elems_.pop_back();
}

// специализированная поп-функция

template<>
void Stack<int>::pop()
{
 cout << "Called Specialized ";
 elems_.pop_back();
}

main.cpp

Stack<int> mystack;
mystack.push(10);
mystack.pop(); ---> this calls specialized one Why ?

Stack<int,vector<int>> mystack;
mystack.push(10);
mystack.pop(); ---> this calls  template one Why ?

1 Ответ

0 голосов
/ 12 мая 2018

Ваша специализация благодаря параметру по умолчанию

template<>
void Stack<int, std::vector<int>>::pop()
{
    cout << "Called Specialized ";
    elems_.pop_back();
}

Таким образом, оба следующих вызова вызывают специализацию

Stack<int> mystack1; // Stack<int, std::vector<int>>
mystack1.push(10);
mystack1.pop(); // ---> this calls specialized

Stack<int, vector<int>> mystack2;
mystack2.push(10);
mystack2.pop(); // ---> this calls specialized

, но несоответствующие типы вызовут универсальный:

Stack<int, list<int>> mystack3;
mystack3.push(10);
mystack3.pop(); // ---> this calls generic one

Stack<char> mystack4; // Stack<char, std::vector<char>>
mystack4.push(10);
mystack4.pop(); // ---> this calls generic one
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...