2014-09-25 2 views
0

Я начинающий на C++, следующий примерный код очень прост, но я получаю загадочную ошибку. Field has incomplete type "ItemType" ErrorC++ шаблон «Поле имеет неполный тип»

Код от абстракции данных & Устранение неполадок с C++ Франком Carrano. Pg. 32 - 33, стр. 37

Я использую Xcode 6.0 (6A267n) на OSX Yosemite Beta 10.10

В заголовочном файле (Listing C1-03)

/** @file PlainBox.h */ 

#ifndef __PlainBox__ 
#define __PlainBox__ 

//Indicates this is a template definition 
template<class ItemType> 
// Declaration for the class PlainBox 
class PlainBox 
{ 
private: 
    // Data field 
    ItemType item; //error here 
public: 
    // Default constructor 
    PlainBox(); 

    // Paramerized constructor 
    PlainBox(const ItemType& theItem); 

    // Method to change the value of the data field 
    void setItem(const ItemType& theItem); 

    // Method to return item form the data field 
    ItemType getItem() const; 

}; // end PlainBox 
#include "PlainBox.cpp" 
#endif /* defined(__PlainBox__PlainBox__) */ 

В CPP файле (listing C1-04)

/** @file PlainBox.cpp */ 
#include "PlainBox.h" 
template<class ItemType> 
PlainBox <ItemType> :: PlainBox() 
{ 
} //end default constructor 
template<class ItemType> 
PlainBox <ItemType> ::PlainBox(const ItemType& theItem) 
{ 
    item = theItem; 
} //end constructor 
template<class ItemType> 
void PlainBox <ItemType> ::setItem(const ItemType &theItem) 
{ 
    item = theItem; 
} //end setItem 
template<class ItemType> 
ItemType PlainBox <ItemType> ::getItem() const 
{ 
    return item; 
} //end getItem 

EDIT: Оказывается, я должен удалить .cpp-файл формирует проект Xcode и удаляет #include в .cpp-файле.

Xcode drop down menu Remove Reference

+0

не связана с реальной проблемой, но '__PlainBox__PlainBox__' является зарезервированным идентификатором, и вы не должны действительно включать' stdio.h' в коде C++. Какую команду вы используете для компиляции этого кода? И вставьте полный набор сообщений об ошибках компилятора. –

+1

Когда вы получите эту ошибку? Скомпилирует ли приведенный выше код ошибку или вам нужно использовать шаблон класса для получения ошибки. BTW, если это код, скопированный из книги, предназначенной для обучения вам C++, я бы рекомендовал вам получить другую книгу: он содержит несколько более или менее серьезных проблем, которые вы хотите избежать в реальном коде. Например, при создании экземпляра со встроенным типом 'item' не инициализируется в конструкторе, другой конструктор без необходимости сначала строит' item' только для его назначения, он использует зарезервированные имена и, на мой взгляд, использует '' редко имеет место на C++. –

+0

Я компилирую этот код на Xcode, command + R. Я получаю эту ошибку, как только я ее набрал. Xcode показывает красный флаг на этой строке. – tomtom

ответ

0

Это link заставляет меня верить, вы должны попытаться положить все в заголовке. Хотя other потоки даже связывают эту статью, говорят иначе, стоит попробовать.

Кроме того, это звучит глупо, но попробуйте переместить ключевое слово шаблона непосредственно перед ключевым словом класса (выньте строку комментариев). Это не имело значения с помощью компилятора g ++, но я знаю, что некоторые vcc-версии придирчивы к этому и, возможно, даже к LLVM. Что-то вроде

template <typename T> 
class myclass{ 
} 

или даже

template <typename T> class myclass{ 
} 
+0

Если я '# включаю' .cpp-файл в .h-файл, а затем удаляю ссылку на .cpp-файл из Xcode, то он работает. Ключевым моментом является то, что мне пришлось удалить его из Xcode без удаления файла. В противном случае он жалуется на неизвестные имена. – tomtom

+0

Странно. Может быть, Xcode добавляет свою собственную линию компиляции в разные файлы? – Dan

+0

Это может быть глупый вопрос, но что такое компиляция? – tomtom

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