【问题标题】:C++ - Undefined reference issues when working with classesC++ - 使用类时未定义的引用问题
【发布时间】:2010-10-28 15:36:25
【问题描述】:

我正在做一个使用多个类的小项目。其中一个类是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)'

有什么猜测吗?

感谢您的宝贵时间。

【问题讨论】:

  • 标题中是否定义了template &lt;class C&gt; void Menu::showContainer(std::list&lt;C&gt;, int, int)
  • 那么你应该接受一个答案。
  • 是的,我正在等待接受期结束。

标签: c++ class templates undefined-reference


【解决方案1】:

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

您可能已经在某个实现文件中进行了定义。

如果是,请将其移至页眉中。

干杯,

【讨论】:

  • 这次你是第一个回答的。 :-)
  • 我很幸运。我想也许我会做真正的程序员会做的事情:自动化这件事。当然,那我首先需要创建一个专家系统来综合答案。 ;-)
【解决方案2】:

看起来编译器在编译 main.cpp 时只看到了 showContainer 的声明,而不是定义。请参阅C++FAQLite 这篇文章。

【讨论】:

    【解决方案3】:

    试试:

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

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2019-02-23
      • 2010-11-16
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      相关资源
      最近更新 更多