1

次のプログラムを検討してください。

#include <iostream>
using namespace std;

int sum (int & a, int & b)
{
  cout <<" NOn template function "<<endl;
  return a+b;
}

template <typename T>
int sum ( const T & a, const T & b)
{
  cout<<"Template Generated .."<<endl;
  return a+b;
};


int main(int argc, char ** argv)
{
  cout <<sum(10,20)<<endl;;
}

何が問題ですか:

非テンプレート関数の sum() が呼び出されることを期待していました。しかし、私の出力テンプレートでは、初期化された関数が呼び出されます。関数テンプレートのオーバーロードの一部ではありませんか。

私がここでやっている間違いの点を教えてください。

4

3 に答える 3

4

非テンプレート関数の sum() が呼び出されることを期待していました。

非 const 参照にバインドできない右辺値を渡しています。したがって、テンプレート バージョンが選択されます。

ORに変更int &すると、最初のバージョンが選択されます。int const &int

それが役立つことを願っています。

于 2013-04-01T05:20:28.073 に答える
3

問題はint&テンポラリにバインドできないため、非テンプレート バージョンは使用できません。int& i = 10;やってはいけないことをするのと同じです。

10および20prvalues です (3.10):

prvalue (「純粋な」右辺値) は、xvalue ではない右辺値です。【例:戻り値の型が参照でない関数の呼び出し結果はprvalue。12、7.3e5、または true などのリテラルの値も prvalue です。—終わりの例]

于 2013-04-01T05:20:28.347 に答える
0
template <typename T>
T sum ( const T & a, const T & b)
{
  cout<<"Template Generated .."<<endl;
  return a+b;
};

Tsum ( const T & a, const T & b) 変更intT

于 2013-04-01T05:22:41.047 に答える