2013-04-12 5 views
1
template <class Type> 
class Punct { 

protected: 

    Type _x; // (1) 
    Type _y; // (1) 

public: 

    Punct(Type = 0, Type = 0); // (2) 
    ~Punct(); 
    inline Type getX() const { return _x; } 
    inline Type getY() const { return _y; } 

    inline void setX(Type x) { _x = x; } 
    inline void setY(Type y) { _y = y; } 
    inline void moveBy(int x, int y) { _x = x; _y = y; } 

friend std::istream &operator>>(std::istream&ins, Punct<Type>& A); 
friend std::ostream &operator<<(std::ostream&outs, const Punct<Type>& A); 

}; 

Эти ошибки я получаю:поле имеет неполную тип

(1) - Полевая имеет незавершенный тип 'Тип'

(2) - Нет жизнеспособного преобразование междунар к типу (и некоторые добавить 3. Передача аргумента в параметр здесь)

Не могли бы вы рассказать мне, что я делаю неправильно?

+0

Этот код не имеет смысла. «Тип» - это тип, а не переменная, поэтому вы не можете присвоить ему значение. Вы хотели добавить имя переменной в свой конструктор. Покажите нам определение 'Type'. –

+1

@EdS: это не присвоение, это инициализация. –

+0

@Teodora: это зависит от типа, с которым вы создаете экземпляр. ** показать код ** –

ответ

1

Этот код работает для меня. g++ 4.7.2 на Kubuntu 12.04.

Кстати, у вас есть все реализации Вашего Punct класса в одном файле, то есть, файл заголовка или разделить их на .h и .cpp?

#include <iostream> 
using namespace std; 

template <class Type> 
class Punct { 

protected: 

    Type _x; // (1) 
    Type _y; // (1) 

public: 

    Punct(Type = 0, Type = 0) {}; // (2) <- empty function body added 
    ~Punct() {}; // <- empty function body added 
    inline Type getX() const { return _x; } 
    inline Type getY() const { return _y; } 

    inline void setX(Type x) { _x = x; } 
    inline void setY(Type y) { _y = y; } 
    inline void moveBy(int x, int y) { _x = x; _y = y; } 

    template<class T> // <- added 
    friend std::istream &operator>>(std::istream&ins, Punct<T>& A); 
    template<class T> // <- added 
    friend std::ostream &operator<<(std::ostream&outs, const Punct<Type>& A); 

}; 

// bogus function added 
template<class T> 
istream &operator>> (istream &i, Punct<T> &a) 
{ 
    return i; 
} 

// bogus function added 
template<typename T> 
ostream &operator<< (ostream &i, const Punct<T>& a) 
{ 
    return i; 
} 

int main() 
{ 
    Punct<int> a; 
} 
+0

Да, я реализовал не встроенные функции в .cpp-файле, почему? – Teodora

+1

@Teodora Для класса шаблонов, как правило, вся реализация идет в файле заголовка. Если нет, необходимо много усилий. см. это сообщение: http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – gongzhitaao

+1

@Teodora: Templatized классы должны быть полностью определены (реализованы) в файлы заголовков. Это ограничение наложено из-за того, как работает связь. Прочтите [этот вопрос] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) для получения дополнительной информации. –