2010-10-28 31 views
0

我正在使用多个类的小型项目。其中一类是Menu,它有一个showContainer方法。这里是类声明:C++ - 使用类时未定义的引用问题

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

任何的猜测?

谢谢你的时间。

+1

是'模板无效菜单:: showContainer(标准::名单,INT,INT)'在头文件中定义? – 2010-10-28 15:39:42

+0

是的。解决了,谢谢! – 2010-10-28 15:48:50

+0

那么你应该接受一个答案。 – 2010-10-28 15:52:09

回答

3

您定义的Menu::showContainer函数模板必须对调用它的代码可见,除非它已针对调用中使用的类型显式实例化。

你可能已经在某些实现文件中定义了。

如果是这样,请将其移动到标题中。

干杯&心连心,

+0

这次你是第一个回答。 ':-)' – 2010-10-28 15:43:52

+0

我很幸运。我想也许我会做真正的程序员所做的事情:自动化这件事。当然,我首先需要创建一个综合答案的专家系统。 ;-) – 2010-10-28 15:57:30

1

貌似编译器只看到showContainer的声明,而不是定义时,它的编译main.cpp中。请参阅C++FAQLite这篇文章。

0

尝试:

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