我在VS 2010工作。我正在尝试扩展功能并重新定义multimap容器的任何功能:
// test_multimap.h
#include <map>
namespace std
{
template <typename TKey, typename TData,
class Compare = less<TKey>,
class Alloc = allocator<pair<const TKey, TData>>
>
class test_multimap: public multimap<TKey, TData, Compare, Alloc>
{
public:
void clear()
{
multimap<TKey, TData>::clear();
}
/*...*/
这样可行,但如果我尝试执行成员函数,我会遇到一些问题:
// test_multimap.h
#include <map>
namespace std
{
template <typename TKey, typename TData,
class Compare = less<TKey>,
class Alloc = allocator<pair<const TKey, TData>>
>
class test_multimap: public multimap<TKey, TData, Compare, Alloc>
{
public:
void clear();
/*...*/
// test_multimap.cpp
#include "stdafx.h"
#include "test_multimap.h"
namespace std
{
template <typename TKey, typename TData,
class Compare = less<TKey>,
class Alloc = allocator<pair<const TKey, TData>>
>
void test_multimap<TKey, TData, Compare, Alloc>::clear()
{
multimap<TKey, TData>::clear();
}
}
在这种情况下,我收到错误
C4519(默认情况下,模板参数只能在类模板中使用) 在其他情况下,我会得到一组不同的错误。
如何执行模板成员函数?
答案 0 :(得分:0)
只需执行错误建议:在定义函数时不要使用默认值,您就可以了。
namespace std
{
template <typename TKey, typename TData,
class Compare,
class Alloc
>
void test_multimap<TKey, TData, Compare, Alloc>::clear()
{
multimap<TKey, TData>::clear();
}
}
您的代码还有两个问题:
test_multimap
似乎可以正常工作,但只要有人尝试以多态方式使用它并通过基类指针删除test_multimap
,就会遇到未定义的行为。std
命名空间添加类(第17.6.4.2.1 / 1节:如果向命名空间std添加声明或定义,则C ++程序的行为是未定义的除非另有说明,否则命名空间std中的命名空间。)。只需使用不同的命名空间。