2017-08-14 33 views
-3

私はと呼ばれる機能を有している#include <algorithm>を使用することを関数と同じ名前の変数を使用するにはどうすればよいですか?

template<class T1, class T2, int max> 
class Collection{ 
    T1 * _elementi1[max]; 
    T2 * _elementi2[max]; 
    int currently; 
public: 
    Collection() { 
     for (size_t i = 0; i < max; i++) { 
      _elementi1[i] = nullptr; 
      _elementi2[i] = nullptr; 
     } 
     currently = 0; 
    } 
    ~Collection() { 
     for (size_t i = 0; i < max; i++) { 
      delete _element1[i]; _element1[i] = nullptr; 
      delete _element2[i]; _element2[i] = nullptr; 
     } 
    } 
    T1 ** GetT1() { return _element1; } 
    T2 ** GetT2() { return _element2; } 
    int GetCurrent() { return currently; } 
    void Add(T1 t1, T2 t2) { 
     if (currently == max) 
     { 
      throw exception("MAX SIZE REACHED"); 
     } 

     _element1[currently] = new T1(t1); 
     _element2[currently] = new T2(t2); 
     ++currently; 
    } 

    friend ostream& operator<< (ostream &COUT, Collection&obj) { 
     for (size_t i = 0; i < obj.currently; i++) 
      COUT << *obj._element1[i] << " " << *obj._element2[i] << endl; 
     return COUT; 
    } 


}; 

Maxは、コレクションの容量を(愚かな私が知っている...)の問題を制限するために使用される次の属性/クラスと与えられたテンプレートクラスをされていmaxも同様である。私は変数Intellisenseを使用するたびに、コンパイラは変数の代わりに関数を使用します。変数maxを使用するようにコンパイラに指示しますが、関数は使用しません。

また、コードの改善やその他の提案を提出する前に、変数の名前の変更や変更が許可されていない試験の例を参考にしてください。

+0

"と表示されているものを追加することは許可されています。" - 削除する方が良いと思います。 –

+0

先生にここで何をするか教えてください。最も簡単な解決策は、名前を「最大」に変更することですが、これが教師によって明示的に禁止されている場合は、問題にする必要があります。 – GManNickG

+10

'using namespace std;'を使用しないでください。そうすれば、あなたは 'max'と' std :: max'を持ちます。 – gurka

答えて

1

修正されていない「試験の例」はコンパイルされますか?

はい、その私は、これはあなたが追加した証拠だと思い、私はアルゴリズム

が含まれていないと仮定しない「を使用して名前空間std;」をどこか、おそらく<アルゴリズム>

のうちのいくつかの機能を取得するにはどうすれば変数maxとしませ 機能を使用するようにコンパイラに指示しますか?

一つの方法は、私が削除を意味し、このことにより、...プルインする名前空間std機能のすべてまたはいずれかをローカル名前空間にあなたのコンパイラの要求をキャンセルすることである「を使用して名前空間std;」を

さて、おそらくあなたは<アルゴリズムの機能を必要とする> ...どのようにもに引っ張らず、それを得るのですか「のstd :: maxの」

例:<アルゴリズムから>、私は頻繁に(シャッフルを使用)

#include <algorithm> 

// ... then I usually do 
std::shuffle (m_iVec.begin(), m_iVec.end(), gen); 

// I have no problem using the std:: prefix. 

この時点で、関数std :: max()はコンパイラにも知られていますが、変数名と競合しません。関数にアクセスする唯一の方法は、 "std :: max()"シンボルを使用することです。


のように見える「を使用して」別の形の、ある:私はここに呼び出していた「シャッフル()」メソッドのヒント/リマインダーを探さなければならない後フォーエバー

#include <algorithm> 

// now 'bring in' the feature you want. 
using std::shuffle; // pull in shuffle, BUT NOT std::max 

// ... so I now can do 
shuffle (m_iVec.begin(), m_iVec.end(), gen); 

// and have no worries about max being interpreted as a function 
max = 0; 

が。

+0

コードの作者は、あなたとあなたがそれを試してみんなのためのトラップを築いた...あなたはそれのために落ちた。 "using namespace std"をstd :: maxで引いて、単純に 'max()'と呼ぶことができます。シンボルmax()が既に変数によって使用されているため、トラップが発生します。変数には名前空間がありません(そうですか?)ので、このトラップを認識して、必要な1つのstdシンボルのみを取り込みます。 –

+0

次の宣言的なリストを使用することで、問題が示されます。 "void showMax(int max){std :: max; std :: cout << max << std :: endl;}" ...コンパイラが不満を表明します: 'operator <<'(オペランドの型'std :: ostream {別名std :: basic_ostream }'と '<未解決オーバーロードされた関数型>') "maxはintではなく関数です。 –

関連する問題