Явная специализация шаблона

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

c:\users\***\documents\visual studio 2010\projects\template array\template array\array.h(49): ошибка C2910: 'Array::{ctor}': не может быть явно специализированным

#ifndef ARRAY_H
#define ARRAY_H

template <typename t>`
class Array
{
public:
Array(int);

int getSize()
{
    return size;
}
void setSize(int s)
{
    size = s;
}
void setArray(int place, t value)
{
    myArray[place] = value;
}
t getArray(int place)
{
    return myArray[place];
}
private:
    int size;
    t *myArray;
};

template<typename t>
Array<t>::Array(int s=10)
{
    setSize(s);
    myArray = new t[getSize()];
}

template<>
class Array<float>
{
public:
    Array();
 };

template<>
Array<float>::Array()
{
    cout<<"Error";
} 

#endif

Спасибо


person David    schedule 22.01.2012    source источник


Ответы (1)


Реализация конструктора специализации не является шаблоном! То есть вы просто хотите написать:

Array<float>::Array()
{
    std::cout << "Error";
}

На самом деле кажется, что вы хотите ограничить использование вашего шаблона класса 'Array', чтобы он не использовался с 'float', и в этом случае вы можете захотеть только объявить, но не определить вы специализируетесь на том, чтобы превратить ошибку времени выполнения в ошибку времени компиляции:

template <> class Array<float>;

Конечно, существует множество вариантов предотвращения создания экземпляров классов. Однако создание ошибки во время выполнения кажется худшим вариантом.

person Dietmar Kühl    schedule 22.01.2012
comment
У меня все еще есть проблемы... Как должен выглядеть весь код? - person David; 22.01.2012
comment
Удалите «template‹›» перед «Array‹float›::Array()». Другие ошибки, которые я получаю, не связаны с этой конкретной проблемой: мне нужно было добавить #include <iostream> и using namespace std;, и мне нужно было удалить аргумент по умолчанию из определения шаблонного конструктора Array (вам нужен аргумент по умолчанию в декларация). С этими изменениями он компилируется для меня с использованием g++, clang и внешнего интерфейса EDG. - person Dietmar Kühl; 22.01.2012
comment
Странно: template <> нужно в gcc. - person Naszta; 21.10.2013