Ошибка шаблонов C ++: создается из 'void TestClass :: testMethod (T, std :: map) [с T = SomeClass] - PullRequest
0 голосов
/ 31 мая 2010

В моем коде есть проблема, с которой я не могу справиться:

#ifndef TESTCLASS_H_
#define TESTCLASS_H_

#include <map>

using namespace std;
template <typename T>
class TestClass
{
public:
  TestClass(){};
  virtual ~TestClass(){};
  void testMethod(T b,std::map<T,int> m);
};

template <typename T>
void TestClass<T>::testMethod(T b,std::map<T,int> m){
  m[b]=0;
}
#endif /*TESTCLASS_H_*/

int main(int argc, char* argv[]) {
  SomeClass s;
  TestClass<SomeClass> t;
  map<SomeClass,int> m;
  t.testMethod(s,m);
}  

Компилятор выдает мне следующую ошибку в строке m [b] = 0; :

создается из 'void TestClass :: testMethod (T, std :: map) [с T = SomeClass]

Не могли бы вы помочь найти проблему ??

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 31 мая 2010

Даже не видя ошибки, я могу сказать вам одну вещь, которую вы, вероятно, делаете неправильно. Здесь:

void TestClass<T>::testMethod(T b,std::map<T,int> m){

Вы знаете, что вы берете целую карту со значением ?

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

Отсюда либо оператор:

bool operator<(const SomeClass&,const SomeClass&)
{ 
     return ...;
} 

... или функтор:

struct CompareSomeClass {
  bool operator()(const SomeClass&,const SomeClass&) 
  {
      return ...;
  }
};
0 голосов
/ 01 июня 2010

Ты прав. Оператор перегрузки <в SomeClass решил проблему: </p>

bool operator<(const SomeClass &s1) const{
    ....
 }

Большое спасибо!

0 голосов
/ 31 мая 2010

Скорее всего, SomeClass не определено для operator<.Определите это, и вам должно быть хорошо идти:

bool operator<(const SomeClass &sc1, const SomeClass sc2)
{
    ...
}
0 голосов
/ 31 мая 2010

Это

#include <map>

class SomeClass {};

bool operator<(const SomeClass&,const SomeClass&);

class in {};

template <typename T>
class TestClass
{
public:
  TestClass(){};
  virtual ~TestClass(){};
  void testMethod(T b,std::map<T,int> m);
};

template <typename T>
void TestClass<T>::testMethod(T b,std::map<T,int> m){
  m[b]=0;
}

int main() {
  SomeClass s;
  TestClass<SomeClass> t;
  std::map<SomeClass,int> m;
  t.testMethod(s,m);
}

прекрасно компилируется для меня, используя VC10 и Comeau.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...