2016-12-11 20 views
3

<<演算子をオーバーライドしようとしていますが、コンパイラが実装を認識せず、代わりにビットシフトとして解釈しようとしているようです。 私は既にパラメータタイプ(const T&T&Tconst T)を使用して遊んでいませんでした。オーバーライドされた<<演算子が認識されない

#pragma once 

template<typename T> class AbstractStack 
{ 
    public: 
     virtual bool Push(const T &) = 0; 
} 

template <typename T> class ArrayStack : public AbstractStack <T> 
{ 
    public: 
     bool Push(const T&) { 
      .... 
     } 
} 

template <typename T> bool operator<<(const AbstractStack<T>* &, const T&) { 
    return stack->Push(item); 
} 


int main() { 
    AbstractStack<int> *stack = new ArrayStack<int>(5); 
    int a = 2; 
    stack << a; // <<-- compiler error 
    return 0; 
} 

報告されたエラーがある:

Error (active)  expression must have integral or unscoped enum type Lab10 
Error C2296 '<<': illegal, left operand has type 'AbstractStack<int> *' 

私は値としてクラスに作用する同じ演算子を定義した場合、それだけで動作します...

+3

少なくとも1つのクラスタイプのオブジェクトで演算子をオーバーロードすることができます。 1つの引数にはポインタがあり、もう1つの引数は整数です。 – 0x499602D2

+0

ArrayStackのメンバー関数としてオペレータを宣言する – Ripi2

+0

これを見てください:http://stackoverflow.com/questions/6171630/why-isnt-operator-overloading-for-pointers-allowed-to-work – NPE

答えて

3

演算子のオーバーロードを、少なくとも一つのの引数は、クラスまたは列挙型でなければなりません。基本的には、カスタム型(ユーザ定義型)のオーバーロードを許可または制限します。

cppreferenceから;

演算子が式に含まれ、オペランドの少なくとも1つにクラス型または列挙型がある場合、オーバーロード解決が使用されるすべての関数の中で呼び出されるユーザー定義関数を決定するために使用されます。シグネチャは次のものと一致します...

これは、組み込みの型のオーバーロードを防ぐことができます。この場合は、引数として持つポインタと整数

あなたがすでに質問に述べたように、解決方法は最初の議論を参考にしています。それがなるとはいえ、あなたがリソースの管理を支援し、オーバーロードされた演算子(で「ポインタ」を利用することstd::shared_ptrの使用を調査することができ、あなたが使用することを求めている抽象基本クラスを考えると

template <typename T> 
bool operator<<(AbstractStack<T> &, const T&) 
{ //... 

スマートポインタ);その他など

template <typename T> 
bool operator<<(std::shared_ptr<AbstractStack<T>>&, const T&) 
{ 
    return stack->Push(item); 
} 

int main() { 
    std::shared_ptr<AbstractStack<int>> stack = std::make_shared<ArrayStack<int>>(5); 
    int a = 2; 
    stack << a; 
    return 0; 
} 
2

任意の組み込み演算子をオーバーロードすると、ユーザ定義型のオブジェクトを必要とする、と述べています。ポインタは機能しません。そして、解決策は、ポインタの代わりにオブジェクトを使用することです:

template <typename T> bool operator<<(AbstractStack<T>&, const T&) { 
    return stack.Push(item); 
} 

それからオブジェクトでそれを呼び出してください。あなたがフリーストアから割り当てようとしているコードには、正当な理由はありません。

int main() { 
    ArrayStack<int> stack(5); 
    int a = 2; 
    stack << a; 
    return 0; 
} 
+0

@Angew - ありがとう。一定。 –

関連する問題