реализация специализации шаблона - PullRequest
2 голосов
/ 23 января 2012

Мне нужно реализовать специализацию шаблонов, при реализации конструктора для специализированных шаблонных классов класс компилятор выдает несколько ошибок.Ниже приведен мой код:

#include <iostream>
using namespace std;

// class template

template <typename T>
class mycontainer
{

T element;
  public:
    mycontainer (T arg);
    T increase () {return ++element;}
};

// class template specialization
template <>
class mycontainer <void> {
  int element;
  public:
    mycontainer (int arg);

    char uppercase ()
    {
    return element;
    }
};

template<typename T> mycontainer<T>::mycontainer(T arg){
    cout << "hello T" << endl;
}

template<typename T> mycontainer<void>::mycontainer(int arg){
    cout << "hello Empty" << endl;
}

int main () {
    mycontainer<int> myint (7);
    mycontainer<void> myvoid (6);
    cout << myint.increase() << endl;
    return 0;
}

Код генерирует эти ошибки:

test.cpp:31:22: error: prototype for ‘mycontainer<void>::mycontainer(int)’ does not match any in class ‘mycontainer<void>’
test.cpp:16:26: error: candidates are: mycontainer<void>::mycontainer(const mycontainer<void>&)
test.cpp:19:5: error:                 mycontainer<void>::mycontainer(int)

Любая подсказка о том, как устранить эти ошибки?

Ответы [ 3 ]

1 голос
/ 23 января 2012

mycontainer<void> не является шаблоном и не является его конструктором, поэтому определение конструктора должно быть просто:

mycontainer<void>::mycontainer(int arg){
    cout << "hello Empty" << endl;
}
0 голосов
/ 23 января 2012

Ваш синтаксис для полной специализации неверен, вы НЕ ДОЛЖНЫ использовать 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;
}
0 голосов
/ 23 января 2012

Ваш прототип

template<typename T> mycontainer<void>::mycontainer(int arg){
  cout << "hello Empty" << endl;
}

не соответствует специализации. Оставьте параметр шаблона пустым.

При этом: ваш C ++ не выглядит так, как будто вы готовы к использованию шаблонов. Сначала вы должны понять основы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...