2012-01-22 4 views
3

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

c:\users\***\documents\visual studio 2010\projects\template array\template array\array.h(49): error C2910: 'Array::{ctor}' : cannot be explicitly specialized

#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 

Благодарности

ответ

5

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

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

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

template <> class Array<float>; 

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

+0

У меня все еще есть проблемы ... Как выглядит весь код? – David

+0

Удалить 'template <>' перед 'Array :: Array()'. Другие ошибки, которые я получаю, не связаны с этой конкретной проблемой: мне нужно было добавить «#include » и «using namespace std;», и мне нужно было удалить аргумент по умолчанию из _definition_ шаблона конструктора Array (вы хотите, чтобы аргумент по умолчанию в _declaration_). С этими изменениями он компилируется для меня, используя g ++, clang и front-end EDG. –

+0

Спасибо за помощь! – David

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