如何访问模板函数中的成员指针
How to access member pointers in template functions
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));
}
- 尝试包括
<QTextEdit>
Ui::MainWindow
是否真的定义了一个名为textEdit
的成员?
如果您可以发布构建错误,这将有所帮助。
最后,只是一个建议,但我建议将其作为非成员函数移动到您的 cpp 文件中:
template<class T> void writeToOuput(Ui::MainWindow* ui, T arg)
{
ui->textEdit->append(QString("%1").arg(arg));
}
理由:
- 更少的编译时依赖关系,更快的构建。
- 将逻辑与类分离,因为它不需要是成员即可正常运行。
更新: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
}
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针