2012-01-02 6 views
0

は私が混乱して作られた組み合わせ:オーバーロードとテンプレートは、コードの下

  1. 私は演算子のオーバーロード義務付け少なくとも一つの非組み込み型として、コンパイル時にエラーを与えるoperator+<int>を期待していました。試してみたら、int operator+(int i, int j)は失敗します。しかし、何の問題も生じませんでした。なぜですか?

  2. 2+3に電話するとoperator+が呼び出されない場合、私は明示的にoperator+<int>をしなければなりませんか?

  3. 私の定義をoperator+と呼ぶのにoperator+<int>を書く方がいいですか?

  4. 私が参照できる場所はありますか?いいですか?

注:それはAです:私は質問への答えは比較的簡単だと思う "日C++ 5.10"

#include <iostream> 

using namespace std; 

template <typename T> 
T operator+(T i, T j) 
{ 
     return i+j; 
} 

int main() 
{ 
     cout<<2+3; 
     cout<<operator+<int>(2,3); 
     cout<<endl; 
} 

出力は以下の通りです、

bash-2.03$ ./a.out 

55 
+0

どのようにして '2)'を決定しましたか? – thiton

+1

私はこの問題が何であるか分かりません。あなたは関数 'operator +(int、int)'を作成することはできず、同じものではない関数 'operator + (int、int)'を作成したことに気付いています... –

+0

operator + はテンプレートをインスタンス化しています。だから私は演算子+(int、int)が許可されていない場合、演算子+ (int、int)も許可すべきではないと思った。テンプレートはコンパイル時に解決されます。 – rakesh

答えて

1

を使用コンパイラエラー!オペレータ関数が非静的メンバ関数であるか、非メンバ関数である少なくとも一つを有するもののいずれか

:関連の引用は、(C++ 2011)over.oper段落6、最初の文であります型がクラス、クラスへの参照、列挙型、または列挙型への参照であるパラメータ。

EDGのフロントエンド、g ++、およびclang ++の最新バージョンでコードをテストしましたが、これらはすべて正しく、コードを拒否します。

+0

ユーザー定義型ではない型のインスタンス化を可能にするように見える演算子関数用のテンプレートを記述することはできますか?この場合、無効な 'int'のテンプレートを明示的にインスタンス化しようとしているのでしょうか、それともテンプレート宣言自体が無効ですか? –

+0

それはどのように振る舞うべきかです。おそらく、sunStudio10はこれをサポートしていません。私はこのようなテンプレートの宣言は許されていると確信していますが、コンパイラはそれがどのようにすべきかを文句を言うでしょう。 – rakesh

+0

@CharlesBailey:インスタンス化できるかのように見えるテンプレートを書くことができます。上記のオペレータ。しかし、対応するインスタンス化は失敗するか、または考慮されない(すなわち、コンパイラはオペレータをインスタンス化しようとしない)。 –

関連する問題