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

时间:2012-02-27 20:18:39

标签: c++

class A
{
  pointer* p;
  template<class T> f(T a)
  {
    p->property()->doSomething(a); // doSomething is a template function
  }
};

上面不会编译,但我想访问模板函数中的成员指针,即使它不安全。我想这样做的原因是因为'p-&gt; property() - &gt; 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-&gt; textEdit-&gt; append(QString(“%1”)。arg(arg));'在代码中

编辑:这是另一个错误:'Ui :: MainWindow的转发声明' 当我点击它时,它就没有了。

3 个答案:

答案 0 :(得分:1)

问题的方式就像现在一样,我真的很难弄清问题是什么。但是,如果这是给您带来麻烦的代码:

template<class T> void writeToOuput(T arg)
{
    ui->textEdit->append(QString("%1").arg(arg));
}
  1. 尝试包含<QTextEdit>
  2. Ui::MainWindow是否实际定义了名为textEdit的成员?
  3. 如果您可以发布构建错误,这会有所帮助。

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

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

    理由:

    1. 减少编译时依赖性,加快构建速度。
    2. 将逻辑与类解耦,因为它不需要成为正常运行的成员。
    3. 更新:op发布了错误。

        

      编辑:这是我得到的错误:'无效使用不完整类型   UI ::主窗口“

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

答案 1 :(得分:1)

我认为这部分:

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的缺少转换运算符。

答案 2 :(得分:1)

我认为它根本与模板无关! 编译器消息说:

  • 你前进声明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
}