2013-05-03 3 views
6

я получил эту ошибку, и я не в состоянии решить самзапрос элемента, который имеет тип неклассовую

source.cpp:85:8: error: request for member ‘put_tag’ in ‘aux’, which is of non-class type ‘Keyword()’ 
source.cpp:86:8: error: request for member ‘put_site’ in ‘aux’, which is of non-class type ‘Keyword()’ 
make: *** [source.o] Error 1 

код, который дает мне эту ошибку является

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

Я должен отметить, что слово и сайт char * типа

Теперь мое Ключевое определение класса это один:

class Keyword{ 
private: 

std::string tag; 
Stack<std::string> weblist; 

public: 

    Keyword(); 
    ~Keyword(); 
    void put_tag(std::string word) 
    { 
     tag = word; 
    } 
    void put_site(std::string site) 
    { 
     weblist.push(site); 
    } 

}; 

спасибо!

Update

Изменяя

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

в

Keyword aux; 
aux.put_tag(word); 
aux.put_site(site); 

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

source.o: In function `Algorithm::indexSite(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': 
source.cpp:(.text+0x2c6): undefined reference to `Keyword::Keyword()' 
source.cpp:(.text+0x369): undefined reference to `Keyword::~Keyword()' 
source.cpp:(.text+0x4a8): undefined reference to `Keyword::~Keyword()' 
source.o: In function `Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)': 
source.cpp:(.text._ZN7Keyword8put_siteESs[Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x2a): undefined reference to `Stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
collect2: ld returned 1 exit status 
make: *** [tema3] Error 1 
+2

Подробнее о [наиболее неприятном анализе] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+0

@JoachimPileborg На самом деле это не то же самое? Ошибка OP была проще, чем в статье, связанной с ней. – john

+1

@john: Действительно. Технически это не MVP, потому что нет никакой двусмысленности. Это просто не может быть истолковано как объявление объекта. –

ответ

15

Эта линия не делает то, что вы думаете:

Keyword aux(); 

ли объявить функцию под названием aux, который не принимает никаких аргументов и возвращает Keyword. Вы, скорее всего, имел в виду писать (без скобок):

Keyword aux; 

Какой объявляющий объект типа Keyword.

UPDATE:

Что касается следующей ошибки вы получаете, это потому, что у вас есть декларацию конструктора и деструктора вашего класса, но не определения. Фактически, ошибка, которую вы получаете, исходит от компоновщика , а не от компилятора.

Чтобы обеспечить тривиальное определение вашего конструктора и деструктора, это изменить:

Keyword(); 
~Keyword(); 

В это:

Keyword() { } 
~Keyword() { } 

Или, если эти функции-члены не делать ничего, просто опустить их в all - компилятор будет генерировать их для вас (если вы не добавите какой-либо другой конструктор, объявленный пользователем, что касается конструктора).

+0

, удалив конструктор и деструктор или заменив ваш ответ, я все равно получаю ту же ошибку. – sniperu

+0

@sniperu: Вероятно, вы получите ту же ошибку для чего-то другого, кроме конструктора и деструктора. Вероятно, есть еще одна функция, которую вы забыли определить –

+0

@sniperu: На самом деле, похоже, что вам не хватает определения 'Stack :: push()'. Вы помещали это в файл заголовка? Если нет, см. [Этот вопрос и ответы] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). –

3

Не это

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

но

Keyword aux; 
aux.put_tag(word); 
aux.put_site(site); 

В версии Keyword aux(); является прототип функции не объявление переменной.

0

У меня была такая же проблема, когда я ввожу следующий код в свою основную функцию, у меня есть файлы List.h и List.cpp, содержащие мой класс List.

List<int,int> myList(); 
bool x=myList.isEmpty(); 

я получаю ошибку «запрос на член„IsEmpty“в„MyList“, который имеет типа неклассовой„List()“»

ошибка, потому что компилятор считать MyList () в качестве прототипа функции

когда я исправить код, чтобы быть

List<int,int> myList; 
bool x=myList.isEmpty(); 

я получил ошибку «неопределенная ссылка на` List :: Список()»и пару подобных ошибок для деструктора.

Дальнейшая проверка моего кода и ответов на этой странице Я обнаружил, что мне нужно включить файл List.cpp в main.cpp, но я включил List.h в свой файл List.cpp, но кажется, что эта информация имеет также будет передан в основной файл. дальнейшие чтения для this tutorial объясняют, почему, если я скомпилирую проект без включения List.cpp, он будет компилироваться отлично, потому что файл List.h имеет прототип, но он не сработает на этапе компоновщика, потому что компоновщик не сможет разрешить вызов List() к определенной функции.

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