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的转发声明' 当我点击它时,它就没有了。
答案 0 :(得分:1)
问题的方式就像现在一样,我真的很难弄清问题是什么。但是,如果这是给您带来麻烦的代码:
template<class T> void writeToOuput(T arg)
{
ui->textEdit->append(QString("%1").arg(arg));
}
<QTextEdit>
Ui::MainWindow
是否实际定义了名为textEdit
的成员?如果您可以发布构建错误,这会有所帮助。
最后,只是一个建议,但我建议将其作为非成员函数移动到您的cpp文件中:
template<class T> void writeToOuput(Ui::MainWindow* ui, T arg)
{
ui->textEdit->append(QString("%1").arg(arg));
}
理由:
更新: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
}