C ++ - неопределенные проблемы со ссылками при работе с классами - PullRequest
0 голосов
/ 28 октября 2010

Я работаю над небольшим проектом, в котором я использую несколько классов.Один из этих классов - Menu, который имеет метод showContainer.Вот объявление класса:

class Menu {
    //snip
    Menu();
    Menu(std::string, std::string, int, int);
    virtual ~Menu();
    //snip
    /**
     * Visualiza e providencia navegacao presente num container
     * @param Container a mostrar
     * @return Indice seleccionado pelo utilizador
     */
    template <class C>
    void showContainer(std::list<C>, int, int);
};

Прекрасно компилируется.Я добавил следующий тест в main.cpp проекта:

Menu menu;
Manga* manga1;
manga1->setCapacidade(60);
manga1->setCategoria(LongoCurso);
manga1->setLocalizacao("Norte");
manga1->setNumero(143);
Manga* manga2;
manga2->setCapacidade(60);
manga2->setCategoria(LongoCurso);
manga2->setLocalizacao("Norte");
manga2->setNumero(143);
Manga* manga3;
manga3->setCapacidade(60);
manga3->setCategoria(LongoCurso);
manga3->setLocalizacao("Norte");
manga3->setNumero(143);

std::list<Manga *> teste;
teste.push_back(manga1);
teste.push_back(manga2);
teste.push_back(manga3);
menu.showContainer(teste, 5, 0);

return 0;

. Возвращает следующую ошибку компилятора:

C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src/main.cpp:96: undefined reference to `void Menu::showContainer<Manga*>(std::list<Manga*, std::allocator<Manga*> >, int, int)'

Есть предположения?

Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 28 октября 2010

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

Скорее всего, вы определились в какой-то реализациифайл.

Если это так, переместите его в заголовок.

Cheers & hth.,

1 голос
/ 28 октября 2010

Похоже, что компилятор видит только объявление showContainer, а не определение при компиляции main.cpp. См. Статью C ++ FAQLite на эту тему.

0 голосов
/ 28 октября 2010

Попробуйте:

menu.showContainer<Manga*>(teste, 5, 0); 
...