【问题标题】:templated class in QtQt中的模板类
【发布时间】:2013-12-06 21:08:20
【问题描述】:

是否可以在 Qt 中使用模板类(不是基于 QObject 并且没有 Q_OBJECT 宏)?尝试使用模板类时,我不断收到链接器错误。但是,当我从类中删除模板时,它可以正常编译和链接。我只是想声明一个过滤器类型的局部变量,它使用一个模板,我得到这个链接器错误:

error: undefined reference to `NumericFilter<int>::NumericFilter(int, int)'

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "filter.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    NumericFilter<int> filter(0, 1);
}

MainWindow::~MainWindow()
{
    delete ui;
}

filter.h

template <class T>
class NumericFilter {
  public:
    NumericFilter (int itemType, int val);

  protected:
    T m_val;
};

filter.cpp

#include "filter.h"
template <class T>
NumericFilter<T>::NumericFilter (int, int)
{

}

请注意,如果您删除声明和源文件中的模板并注释掉 'T' 成员,那么它编译得很好。

【问题讨论】:

  • 请分享源代码:)
  • 是的,这应该可以正常工作。您必须错误地定义或实例化该类 - 分享您的代码。
  • 尝试只在头文件中定义NumericFilter并去掉filter.cpp。
  • 好的,在头文件中定义函数起作用了,谢谢。这是非常令人失望的,尽管我必须这样做,因为类定义相当大。
  • 请注意,这不是 Qt 特有的,而是 C++ 的通用

标签: qt templates


【解决方案1】:

http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html

如果您编译并(尝试)链接这两个 .cpp 文件,大多数编译器都会生成链接器错误。有两种解决方案。第一个解决方案是将模板函数的定义物理移动到 .h 文件中,即使它不是内联函数。

此解决方案可能(也可能不会!)导致严重的代码膨胀,这意味着您的可执行文件大小可能会急剧增加(或者,如果您的编译器足够聪明,则可能不会;试试看吧)。 另一种解决方案是将模板函数的定义保留在 .cpp 文件中,只需添加行模板 void foo();到那个文件:

// File "foo.cpp"
#include <iostream>
#include "foo.h"

template<typename T> void foo()
{
  std::cout << "Here I am!\n";
}

template void foo<int>();

因此,对于您的情况,您的 .cpp 文件中有:

#include "filter.h"

template <class T>
NumericFilter<T>::NumericFilter(int, int)
{

}

template NumericFilter<int>::NumericFilter<int>(int, int); // added line!!!

多田!没有编译错误!

顺便说一句,parashift 对 C++ 模板的解释是最好的恕我直言。

希望对您有所帮助。

【讨论】:

  • 谢谢,我会试试这个解决方案。
猜你喜欢
  • 2011-05-22
  • 1970-01-01
  • 2011-07-08
  • 2010-11-29
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多