如何访问模板函数中的成员指针

How to access member pointers in template functions

本文关键字:函数 成员 指针 何访问 访问      更新时间:2023-10-16
class A
{
  pointer* p;
  template<class T> f(T a)
  {
    p->property()->doSomething(a); // doSomething is a template function
  }
};

上面不会编译,但我想访问模板函数中的成员指针,即使它不安全。我想这样做的原因是'p->property((->doSomething(a('实际上真的很长,我试图重写它(我不想使用 #define(。那么,我该怎么做这样的事情呢?

编辑:doSomething是第三方功能...但我认为是这样的:

template<class T>
void doSomething(T a)
{
  // something
}

编辑:这是实际代码:

#include <QMainWindow>
#include <QtNetwork>
#include <QtWebKit>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void replyFinished(QNetworkReply*);

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *nam;
    QUrl _url;
    void outputHeader(QNetworkReply*);
    template<class T> void writeToOuput(T arg)
    {
        ui->textEdit->append(QString("%1").arg(arg));
    }
};

编辑:这是我得到的错误:"无效使用不完整的类型ui::MainWindow"当我单击它时,它会转到代码中的"ui->textEdit->append(QString("%1"(.arg(arg((;"行。

编辑:这是另一个错误:"Ui::MainWindow的前向声明"当我点击它时,它无处可去。

以现在问题的措辞方式,我真的很难弄清楚问题是什么。但是,如果这是给您带来麻烦的代码:

template<class T> void writeToOuput(T arg)
{
    ui->textEdit->append(QString("%1").arg(arg));
}
  1. 尝试包括<QTextEdit>
  2. Ui::MainWindow是否真的定义了一个名为textEdit的成员?

如果您可以发布构建错误,这将有所帮助。

最后,只是一个建议,但我建议将其作为非成员函数移动到您的 cpp 文件中:

template<class T> void writeToOuput(Ui::MainWindow* ui, T arg)
{
    ui->textEdit->append(QString("%1").arg(arg));
}

理由:

  1. 更少的编译时依赖关系,更快的构建。
  2. 将逻辑与类分离,因为它不需要是成员即可正常运行。

更新:op 发布了错误。

编辑:这是我收到的错误:"无效使用不完整的类型 ui::MainWindow'

您需要包含定义 ui::MainWindow 的标头,而不仅仅是使用前向声明。对于像这样的 MOC 生成的文件,通常称为 ui_MainWindow.h。

我认为这部分:

template<class T> void writeToOuput(T arg)
{
    ui->textEdit->append(QString("%1").arg(arg));
}

需要:

template<class T> void writeToOuput(T arg)
{
    ui->textEdit->append(arg);
}

并且您需要提供从类型 T 到 QString 的缺失转换运算符。

我认为它与模板完全无关!编译器消息指出:

  • 你转发声明Ui::MainWindow
  • 您尚未提供Ui::MainWindow的实施
  • 您试图取消引用指向Ui::MainWindow的指针 - 这会触发错误

您必须提供Ui::MainWindow的定义,然后才提供::MainWindow::writeToOutput<T>(T arg)的实现。

如果你不能把Ui::MainWindow的定义放在::MainWindow的定义之前,你必须在这里声明writeToOutput<T>(没有实现(,然后稍后提供实现。请注意,模板函数最好声明为内联(链接器可以对这些函数做奇怪的事情(,并且它们的实现对所有使用它的编译者可见。

要定义一个先前声明的成员函数,您需要放置如下内容:

template <class T>
inline void MainWindow::writeToOuput(T arg) {
    //your body
}