2016-05-08 6 views
-1

私はドライバと、使用する必要のあるメソッドヘッダを提供するプログラミング割り当てを持っています。問題は、メソッドがメンバ関数であり、ドライバが関数を呼び出すために関数のクラスのオブジェクトをインスタンス化しないということです。インスタンス化されたオブジェクトを持たない非静的メンバー関数へのアクセス?

機能ヘッダー:

template <class Comparable> 
void mergesortImproved(vector<Comparable> &a) { //solution here } 

ドライバー(別ファイル)はmergesortImprovedに呼び出す:

mergesortImproved(items); 

我々が変更され、ドライバを提出することが許可されていないので、これが動作するようになっていると思われます。私は何かを見逃しているのですか、これはちょっとした譲歩ですか?

+1

メンバ関数ではありません。クラスが定義されていません。 –

+0

それを編集したとき何が起こったのですか? –

+1

@PeteBecker私は黙って、クラス定義が単に省略されていると仮定しました。私にとっては、文脈からは明らかでした。それについて何か間違っている? – Aconcagua

答えて

1

簡単な回答:これはできません。非静的メンバ関数は、関連付けられたオブジェクトインスタンスなしで呼び出すことはできません。非静的関数は暗黙的に渡されなければならない追加のパラメータを有する(例えば、o->f(10, 12)への呼び出しは暗黙的に_f(o, 10, 12)のようなものに変換され、興味があればcalling conventionsのように見える)。

静的メンバー関数は、まだclassname::function()で呼び出す必要があります。したがって、–は不運です。

しかし:あなたは、オブジェクトをインスタンス化し、オブジェクトのメンバ関数を呼び出すことになる、ヘッダにグローバル関数を置くことができます:

* .H:

class X 
{ 
    template <class Comparable> 
    void mergesortImproved(vector<Comparable> &a) 
    { 
     /* ... */ 
    } 
} 

template <class Comparable> 
void mergesortImproved(vector<Comparable> &a) 
{ 
    X x; 
    x.mergesortImproved(a); 
} 
関連する問題