2012-02-10 11 views
3

私は、テンプレートを使用して時系列プロファイルクラスを作成しています。構造体tmで表される数値インデックスまたは日付と時刻のいずれかでプロファイルをインデックスします。数値インデックスによるインデックス作成は正常に動作しますが、日付によるインデックス付けはオブジェクトへのポインタでは機能しません。ここでは動作するアプローチと動作しないアプローチを含むサンプルコードを示します。グローバルな演算子は「TM」と入力とる見つからない(または全く許容される変換はありません):C++オブジェクトへのポインタがあれば、operator []関数を呼び出す正しい方法は何ですか?

#include "profile.h" // Class Profile<T> is declared and defined here. 
float f; 
int i; 
struct tm d; 
Profile<float> p; 
Profile<float> *pPtr; 

// Non-pointer syntax 
f = p[i];    // this works. 
f = p.operator[](i);  // this works, but its ugly. 
f = p[d];    // this works. 
f = p.operator[](d);  // this works, but its ugly. 

// Pointer syntax 
f = (*pPtr)[i];   // this works. 
f = pPtr->operator[](i); // this works, but its ugly. 
f = (*pPtr)[d];   // this isn't what I typed. I did f = *(pPtr)[d]; 
f = pPtr->operator[](d); // this works, but its ugly. 

このC++コードは、「[」コンパイラエラーメッセージは、バイナリエラーC2677でのVisual Studio 2008に書き込まれています。

C++オブジェクトへのポインタがあれば、operator []関数を呼び出す正しい方法は何ですか?

+2

'f =(* pPtr)[d]; //これはうまくいかない。 '私はそれが働くことを保証するだろう。あなたはどんなエラーを見ていますか? – ildjarn

+0

'(* pPtr)[d]'はどういう意味ですか? '* pPtr'は' Profile & 'を生成するので、これは' p [d] 'に対して受け入れられる加入者演算子を受け入れるべきです。 –

+0

それは本当に変です! 4時間苦労して一貫したコンパイラエラーが発生したので、今すぐ動作します。 8^P –

答えて

2

ここに示したコードは問題ありません。おそらく以前の試みで*(pPtr)[d]の代わりに(*pPtr)[d]を実行していましたが、これはoperator*のほうがoperator[]より低いため、間違いがあります。

+0

特に私は*(pPtr)[d]をやっていました。 –

1

賢明なオプションをリストしました。私はなぜポインタの逆参照が機能しないのか分からない。以下はコンパイルだけです:

std::vector<int> v; 
v.push_back(0); 
v[0]; 

std::vector<int>* vp = &v; 
(*vp)[0]; 
+0

はい、私も今コンパイルします。なぜ私はコンパイラエラーC2677を取得していたかについては説明がありません。 –

0

同様のケースでは、クラスに「at」などの追加メソッドを追加します。だから、

templateType & Profile::at(int idx) 
{ 
    return operator[](idx); 
} 

、コードが良く見える:

f = pPtr->at(i); 

ところで、クラスメソッド(私たちの場合はプロファイル)に(IDX)で使用することはoperator[](idx)ことは簡単だろう。

関連する問題