Проблема с шаблоном - PullRequest
3 голосов
/ 20 сентября 2010

С какой стати я могу это сделать:

#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;
        }

Я подозреваю, что это как-то связано с выводом аргументов, но это так бесит, что "обычный" fnc принят, а шаблон - нет.

Ответы [ 3 ]

10 голосов
/ 20 сентября 2010

Проблема в том, что вы не можете создать указатель на функцию шаблона.Вы должны быть в состоянии создать указатель на экземплярную функцию шаблона.Я не пробовал это, но должно работать следующее:

for_each (myvector.begin(), myvector.end(), myfunction<int>)
5 голосов
/ 20 сентября 2010

Нельзя передать шаблоны третьему аргументу for_each.Вы должны передать экземпляр, который можно вызвать через operator()().В этом случае вы можете создать экземпляр шаблона функции, предоставив все параметры шаблона функции:

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

В примечании к стороне, вам действительно следует избегать using namespace std, так как он вводит много имен, которые могут конфликтовать сваши идентификаторы.Кроме того, вы должны использовать синтаксис &, чтобы было ясно, что вы передаете указатель на функцию.

4 голосов
/ 20 сентября 2010

Поскольку компилятор не может неявно преобразовать шаблон в предикат. Вы должны явно указать, какую функцию вызывать:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...