2016-03-24 38 views
4

Şablonlarla pek çok deneyimim yok, fakat ben de hareket halindeyken öğrenmeye çalışıyorum, bu yüzden birisi bana bu işi yapmak için ne yapmam gerektiğini söyleyebilsin, çünkü typenames ve açık lansman ve açık uzmanlık kullanma örnekleri çok ama sadece int, char, ... gibi temel türleri içerir. Bu yüzden lütfen yardım edin çünkü ne yapacağımı anlamıyorum.C + + Sınıfı Sınıf Üyesi Sınıfı

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; 
} 

Ve alıyorum hata şudur:

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&)| 

Ve ben işlerin yapmak için orada yapmam gerektiğini bilmiyorum. Lütfen yardım et.

+0

Kullanmak için kesinlikle kullanacaksanız, bir başlık dosyasında '' namespace std; 'komutunu kullanmayın. –

+0

, Parça varsayılanını ekleyin, (yeni kurucu ekleyin veya varolan değişkenler için varsayılan değerler ekleyin). Ayrıca desctructor uygulaması hakkında unuttuğunuz gibi görünüyor – jonezq

+0

As @ jonezq bir varsayılan kurucu eklemeniz gerektiğini belirtir, bkz. [Bir derleyici tarafından derleyici tarafından oluşturulan tüm üye işlevleri nelerdir? Bu her zaman olur mu?] (Http://stackoverflow.com/questions/3734247/what-are-all-the-member-functions-created-by-compiler-for-a-class-does-that-hap). –

cevap

1

Sen Yani yapıcı size varsayılan kurucu tedarik edilmez Piece yani

Piece::Piece(int, int, std::string) 

için açık bir yapıcısı sağladı. Şimdi Container'da no-arg kurucuyu kullanıyorsunuz. Hatanın nedeni budur. Piece için argümansız (varsayılan) bir kurucu sağlamanız gerekir. Şimdi

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

hata mesajı olup olmadığını. Sonra başlık dosyasında tanımladınız. Fakat kaynak dosyasında (veya başka bir yerde) bir beden yoktur. Yani linker bulamıyor. Yani kurucuya da bir beden ekleyin.

+0

Bunun için yıkıcı için de bir vücuda ihtiyacınız var. Sadece başlıkta tanımlamak işe yaramaz. Bağlayıcı, hangi kodun yürütüleceğini çalıştırmayacağından bu işlevi çağırır. Bir işlevi açıkça tanımlarsanız ve başka bir yere çağırıyorsanız. Bir vücuda ihtiyacın var. – deeiip

+0

Teşekkürler, bu benim problemlerimi çözdü –

2

yapıcı metotta başlatma listesindeki bir üye başlatmak, o zaman bir varsayılan kurucu sağlamak gerekmez: Kodunuzda

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

} 

, sen yapıcı vücudun içinde üyesi başlatıldı Bu nedenle, bu, element ilk önce varsayılan kurucu tarafından oluşturulmalı ve daha sonra bir atama işleci tarafından değiştirilmiş olması gerektiği anlamına gelir. Ve Piece için varsayılan bir kurucu sağlamadığınız için, bu bir hata verdi.