0

我在 VS 2010 工作。我正在尝试扩展功能并重新定义多图容器的任何功能:

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

如何进行模板成员函数的实现??

4

1 回答 1

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通过基类指针删除 a ,他就会遇到未定义的行为。
  • std标准禁止向命名空间添加类(第 17.6.4.2.1/1 节:如果 C++ 程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则 C++ 程序的行为未定义,除非另有说明。)。只需使用不同的命名空间。
于 2013-05-06T09:28:58.330 回答