2012-02-27 8 views
-2
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)); 
    } 
}; 

編集:ここではエラーがあります、ここで実際のコードです私は次のようになります: '不完全な型の無効な使用:: MainWindow' 私はそれをクリックすると、この行に移動します 'ui-> textEdit-> append(QString( "%1")。 'コード内

編集:ここに別のエラーがあります: 'Forward宣言のUi :: MainWindow' 私はそれをクリックすると、どこにも行きません。

+2

'doSomething'とそのコンテナ' class'の定義だけでなく、コンパイラの出力を記載してください。 –

+0

これが間違っている理由を知るには十分な情報がありません!型ポインタに、型Tのオブジェクトを引数として受け入れるdoSomethingメソッドを持つオブジェクトへのポインタを返すメソッドプロパティがある場合、何も間違いありません。しかし、私はこれが事実ではないと思う...コンパイルしないものの完全なサンプルを提供してください! – PierreBdR

+0

'pointer'とは何ですか? – hmjd

答えて

1

質問が今のように言われているように、私は本当に問題が何であるかを考え出すのに苦労しています。これは、コードあなたの悩み与えている場合は、:<QTextEdit>

  • 含む

    template<class T> void writeToOuput(T arg) 
    { 
        ui->textEdit->append(QString("%1").arg(arg)); 
    } 
    
    1. を試してみてくださいUi::MainWindowは実際にtextEditと呼ばれるメンバーを定義していますか?

    ビルドエラーを投稿できたら助かります。

    そして最後に、ちょうど提案が、私は非メンバ関数としてあなたのcppファイルにこれを移動するお勧めします:

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

    理由:

    1. 少ないコンパイル時の依存関係、より速いビルド。
    2. 正常に機能するためにメンバーである必要はないので、ロジックをクラスから切り離します。

    更新:opにエラーが表示されました。

    Edit: Here's the error I'm getting: 'invalid use of incomplete type ui::MainWindow'

    フォワード宣言だけでなく、ui :: MainWindowを定義するヘッダーを含める必要があります。このようなMOC生成ファイルでは、一般にui_MainWindow.hと呼ばれます。

  • +0

    私はそれを試みました。私は同じエラーが発生しています – user1217419

    +0

    @ user1217419あなたが投稿したエラーで更新を見ました。私は、そのエラーの修正を加えて答えを更新しました。 – stinky472

    +0

    あなたはそれが正しいです。今、別のエラーが出てきますが、私はこれを自分自身で修正しようとしています – user1217419

    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); 
    } 
    

    、あなたはQStringのに型Tから欠落変換演算子を提供する必要があります。

    +0

    +1欠落している変換演算子の潜在的な要件を捕まえるためです。私はQString( "%1")と思う。arg(arg)は、メソッドが引数と同じ名前を持つという事実を考えると、余分で無駄で混乱しても大丈夫だ。 – stinky472

    +0

    arg(arg)argをQStringとQString( "%1")に変換するarg(T a)はテンプレート関数 – user1217419

    1

    テンプレートにはまったく関係ないと思います!エラー をトリガ - あなたはUi::MainWindowへのポインタを参照解除しようとした、まだUi::MainWindow

  • の実装を提供していませんでした

    • あなたはUi::MainWindow
    • フォワード宣言: コンパイラメッセージはと言います

      Ui::MainWindowの定義を指定する必要があります。この定義は後で::MainWindow::writeToOutput<T>(T arg)の実装を提供するだけです。

      あなたが::MainWindowの定義の前にUi::MainWindowの定義を置くことができない場合は、あなただけ(実装なし)ここwriteToOutput<T>を宣言しなければならないし、後で実装を提供します。テンプレート関数は、インライン展開されたもの(リンカはそれを使って奇妙なことをすることができる)として宣言し、その実装を使用するすべてのコンパイル者に表示する方がよいことに注意してください。あなたはこのような何かを配置する必要があります以前に宣言されたメンバ関数を定義するには

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

    この説明も良いです! – user1217419

    +0

    あなたがそれを好きなら、あなたはそれをアップ投票することができます:) – CygnusX1

    +0

    私は、しかし、私は十分な担当者を持っていない – user1217419

    関連する問題