我怎样才能将带有参数的类模板成员的实现默认超出此类模板的边界?

时间:2013-05-06 08:48:46

标签: c++ visual-studio-2010 templates

我在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(默认情况下,模板参数只能在类模板中使用)   在其他情况下,我会得到一组不同的错误。

如何执行模板成员函数?

1 个答案:

答案 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();
    }

}

您的代码还有两个问题:

  • 正如JBL在他的评论中所说,从STL容器继承并不是一个好主意,因为它们没有虚拟析构函数。您的test_multimap似乎可以正常工作,但只要有人尝试以多态方式使用它并通过基类指针删除test_multimap,就会遇到未定义的行为。
  • 标准禁止向std命名空间添加类(第17.6.4.2.1 / 1节:如果向命名空间std添加声明或定义,则C ++程序的行为是未定义的除非另有说明,否则命名空间std中的命名空间。)。只需使用不同的命名空间。