我的代码中有一些问题我无法处理:
#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]
你能帮忙找到问题吗?
提前致谢
答案 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)
bool operator<(const SomeClass &s1) const{
....
}
非常感谢!