我对模板很新 我有下面的代码,我试图隐藏基础接口类后面的模板类。 它现在有效,但我不知道它是否是我尝试做的好方法。 例如,是否可以在一个常用函数中收集insertItem()函数?
struct MyMainClass
{
virtual void writeFirstItem() = 0;
virtual void insertItem(int Key, int Value) = 0;
virtual void insertItem(void* Key, int Value) = 0;
};
template<typename T>
struct MyTempClass : public MyMainClass
{
template<typename T>
struct cmp_str
{
bool operator()(typename T const a, typename T const b) const
{
if(a > b)
return true;
return false;
};
};
template<>
struct cmp_str<wchar_t*>
{
bool operator()(wchar_t* const a, wchar_t* const b) const
{
return std::wcscmp(a, b) < 0;
};
};
template<>
struct cmp_str<char*>
{
bool operator()(char* const a, char* const b) const
{
return std::strcmp(a, b) < 0;
};
};
typedef std::map<typename T, int, cmp_str<typename T> > Mymap;
typedef typename Mymap::const_iterator mymapit;
typename Mymap mymap;
template<typename T>
void insert(T keyVal, int myvalue)
{
mymap[keyVal] = myvalue;
};
void writeFirstItem()
{
std::wcout << std::wstring(L"(") << mymap.begin()->first << L"," << mymap.begin()->second << L")" << std::endl;
}
void insertItem(void* Key, int Value)
{
insert((T)Key, Value);
}
//this one shouldnt be called
void insertItem(int Key, int Value){}
};
template<> template<>
void MyTempClass<int>::insert<int>(int keyVal, int myvalue)
{
mymap[keyVal] = myvalue;
}
template<>
void MyTempClass<int>::insertItem(int Key, int Value)
{
insert(Key, Value);
}
int wmain(int argc, wchar_t* argv[])
{
MyMainClass* a;
MyMainClass* b;
MyMainClass* c;
wchar_t a1[6] = L"asdf";
wchar_t a2[6] = L"12345";
wchar_t a3[6] = L"xyzs";
wchar_t a4[6] = L"12345";
int b1 = 3;
int b2 = 5;
int b3 = 88;
int b4 = 3;
char c1[6] = "casdf";
char c2[6] = "c1234";
char c3[6] = "cxyzs";
char c4[6] = "c1234";
a = new MyTempClass<wchar_t*>;
a->insertItem(a1,3);
a->insertItem(a2,5);
a->insertItem(a3,9);
a->insertItem(a4,3);
b = new MyTempClass<int>;
b->insertItem(b1, 4);
c = new MyTempClass<char*>;
c->insertItem(c1,77);
c->insertItem(c3,99);
a->writeFirstItem();
b->writeFirstItem();
c->writeFirstItem();
}
答案 0 :(得分:0)
我猜你有什么类型的重新定义。这是因为当你在没有“else”部分进行编译时,只有一个cmp_str特化实际上是“实例化”,当你取消注释“else”时 - 另一个“struct cmp_str”出现在同一个翻译单元中。 请告诉我们您尝试使用此组合实现的目标。
答案 1 :(得分:0)
问题是insert()
的第一个参数类型不正确。
当您实例化MyTempClass<int>
时,insert()
函数的签名变为:
void insert(int keyVal, int myvalue);
但是,您插入的调用网站似乎是b->insert(a1, 3);
,其中a1
不属于int
类型。