模板问题

时间:2010-09-20 12:45:27

标签: c++ templates

为什么我能做到这一点:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
  cout << " " << i;
}

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);//<-------See below
return 0;
}

但不能这样做:

template<class T>
    void myfunction (T i) {
          cout << " " << i;
        }

我怀疑它与args演绎有关,但令人气愤的是“常规”fnc被接受而模板不被接受。

3 个答案:

答案 0 :(得分:10)

问题是您无法创建指向模板函数的指针。您应该能够创建指向实例化模板函数的指针。我没有尝试过,但以下情况应该有效:

for_each (myvector.begin(), myvector.end(), myfunction<int>)

答案 1 :(得分:5)

您无法将模板传递给for_each的第三个参数。您必须通过operator()()传递可调用的实例。在这种情况下,您可以通过提供函数的所有模板参数来实例化函数模板:

 std::for_each(myvector.begin(), myvector.end(), &myfunction<int>);

另一方面,您应该避免使用using namespace std,因为它会引入许多可能与您的标识符冲突的名称。此外,您应该使用&语法清楚地表明您正在传递函数指针。

答案 2 :(得分:4)

因为编译器无法隐式地将模板转换为谓词。您必须明确说明要调用的函数:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename T>
void myfunction (T i)
{
    cout << " " << i;
}

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction<int>);
  cout << endl;
}

或者,您可以编写这样的谓词:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct MyPredicate {
    template <typename T>
    void operator () (T i)
    {
        cout << " " << i;
    }
};

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), MyPredicate ());
  cout << endl;
}