C ++模板错误:从'void TestClass :: testMethod(T,std :: map)[与T = SomeClass]实例化

时间:2010-05-31 01:09:43

标签: c++ templates

我的代码中有一些问题我无法处理:

#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 个答案:

答案 0 :(得分:2)

甚至没有看到错误,我可以告诉你一件事你可能做错了。这里:

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

您知道,您正在按照值获取整个地图

但是,这不是错误的来源。 Map是一个已排序的关联容器,它需要可以排序的键。内置类型通过<运算符进行排序。对于您自己的类,您需要提供运算符,或使用自定义排序函数初始化地图。

因此要么是运营商:

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

......或者是仿函数:

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

答案 1 :(得分:0)

#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编译就好了。

答案 2 :(得分:0)

最有可能的是,SomeClass没有为其定义operator<。定义那个,你应该好好去:

bool operator<(const SomeClass &sc1, const SomeClass sc2)
{
    ...
}

答案 3 :(得分:0)

你是对的。重载运算符&lt;在SomeClass中解决了问题:

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

非常感谢!