Ваш синтаксис для полной специализации неверен, вы НЕ ДОЛЖНЫ использовать template<typename T> mycontainer<void>
или даже не template<>
Почему? Смотрите цитату из книги шаблонов C ++:
Таким образом, полное объявление специализации идентично обычному объявлению класса (это не объявление шаблона). Единственными отличиями являются синтаксис и тот факт, что объявление должно соответствовать предыдущему объявлению шаблона. , Поскольку это не объявление шаблона, члены полной специализации шаблона класса могут быть определены с использованием обычного синтаксиса определения члена вне класса (другими словами, префикс шаблона <> не может быть указан):
Так же можно сделать
mycontainer<void>::mycontainer(int arg){
cout << "hello Empty" << endl;
}
или сделайте:
#include <iostream>
using namespace std;
// class template
template <typename T>
class mycontainer
{
T element;
public:
mycontainer<T>::mycontainer(T arg)
{
cout << "hello T" << endl;
}
T increase () {return ++element;}
};
// class template specialization
template <>
class mycontainer <void> {
int element;
public:
mycontainer (int arg)
{
cout << "hello Empty" << endl;
}
char uppercase ()
{
return element;
}
};
int main () {
mycontainer<int> myint (7);
mycontainer<void> myvoid (6);
cout << myint.increase() << endl;
return 0;
}