2016-03-24 3 views
4

У меня нет большого опыта работы с шаблонами, но я пытаюсь учиться на ходу, так что кто-то может сказать мне, что мне делать, чтобы сделать эту работу, потому что я видел множество примеров использования имен типов и явного создания экземпляра и явной специализации, но они включают только основные типы, такие как int, char, ... Так что, пожалуйста, помогите, потому что я не понимаю, что делать.C++ Template Class с классом Member

Container.h

#ifndef CONTAINER_H 
#define CONTAINER_H 

template <typename E> 
class Container 
{ 
    private: 
     E element; 
    public: 
     Container(E pElement); 
     virtual ~Container(); 

}; 

#endif // CONTAINER_H 

Container.cpp

#include "Container.h" 
#include "Piece.h" 

template class Container<Piece>; 

template <typename E> 
Container<E>::Container(E pElement) //Error Here; 
{ 
    element=pElement; 
} 

Piece.h

#ifndef PIECE_H 
#define PIECE_H 

#include <iostream> 
#include <string> 
using namespace std; 

class Piece 
{ 
    private: 
     int x; 
     int y; 
     string z; 
    public: 
     Piece(int pX,int pY, string pZ); 
     virtual ~Piece(); 

}; 

#endif // PIECE_H 

Piece.cpp

#include "Piece.h" 

Piece::Piece(int pX, int pY, string pZ){ 
    x=pX; 
    y=pY; 
    z=pZ; 
} 

И ошибка я получаю это:

src\Container.cpp|7|error: no matching function for call to 'Piece::Piece()'| 
src\Container.cpp|7|note: candidates are:| 
src\Piece.cpp|3|note: Piece::Piece(int, int, std::string)| 
src\Piece.cpp|3|note: candidate expects 3 arguments, 0 provided| 
include\Piece.h|8|note: Piece::Piece(const Piece&)| 
include\Piece.h|8|note: Piece::Piece(const Piece&)| 

И я не знаю, что я должен там делать, чтобы заставить вещи работать. Пожалуйста помоги.

+0

Если вы собираетесь использовать его вообще, не ставьте 'use namespace std;' в файл заголовка. –

+0

добавить конструктор по умолчанию Piece, (добавить новый конструктор или добавить значения по умолчанию для переменных в существующие). Также похоже, что вы забыли о реализации desctructor. – jonezq

+0

Поскольку @jonezq утверждает, что вам нужно добавить конструктор по умолчанию, см. [Что все функции-члены, созданные компилятором для класса? Это происходит все время?] (Http://stackoverflow.com/questions/3734247/what-are-all-the-member-functions-created-by-compiler-for-a-class-does-that-hap). –

ответ

1

Вы предоставили явный конструктор для Piece

т.е.
Piece::Piece(int, int, std::string) 

Так конструктор не поставляет вам конструктор по умолчанию. Теперь в Container вы используете конструктор no-arg. Это и есть причина ошибки. Итак, вам нужно предоставить конструктор no-arg (default) для Piece. Теперь, если

src\Container.cpp|7|undefined reference to `Piece::Piece()' 

- сообщение об ошибке. Затем вы определили его в файле заголовка. Но в исходном файле (или где-то еще) нет тела. Так что линкер не может его найти. Поэтому добавьте тело к конструктору.

+0

Thats, потому что вам нужно тело для деструктора. Просто определение в заголовке не будет работать. Потому что компоновщик не найдет, какой код для выполнения функции вызывается. Если вы явно определяете функцию и вызываете ее в другом месте. Тебе нужно тело. – deeiip

+0

Спасибо, что решил мои проблемы –

2

Если инициализировать элемент в списке инициализации в конструкторе, то вы не должны предоставлять конструктор по умолчанию:

template <typename E> 
Container<E>::Container(E pElement) : element(pElement) 
{ 

} 

В коде, вы инициализирован элемент внутри тела конструктора , поэтому это означало, что element должен быть сначала сконструирован конструктором по умолчанию, а затем модифицирован оператором присваивания. И поскольку вы не указали конструктор по умолчанию на Piece, это дало ошибку.