0

我正在完成我的第二个模板类的工作(将我制作的旧地图类覆盖为模板),并且我正在花最长时间弄清楚如何为我的结构初始化空值。

我使用 2-3-4 树实现了一个映射,其中每个节点实际上是一个 4 节点,正确的值设置为 NULL(例如,一个 3 节点将有 2 个键/值对和三个孩子,第三对并且四个子指针设置为空。

我遇到的问题是我的模板引发错误(直接从我的终端复制):

mymap.cpp:271:3: error: ambiguous overload for âoperator=â in âtemp->Map<int, std::basic_string<char> >::Elem::t3 = 0â

我正在使用的导致此问题的代码是:

//k3 is a KEY value and t3 is a TYPE value
temp -> k3 = NULL;
temp -> t3 = NULL;

现在,我知道问题是 NULL 关键字通常是为指针保留的,并且我相信解析为 \0 或 0,而 KEY 和 TYPE 可以是任何字面意思,可能不支持这样的值。

我的问题是在这种情况下设置空值的正确方法是什么?

谢谢!

4

1 回答 1

0

通常你想要的是默认构造函数获得的值。

#include <utility>
#include <iostream>
#include <string>

template <class A, class B>
void zero(std::pair<A, B>& p)
{
    p.first = A();
    p.second = B();
}

int
main()
{
    std::pair<int, std::string> p { 10, "foo" };

    std::cout << p.first << ' ' << p.second << '\n';
    zero(p);
    std::cout << p.first << ' ' << p.second << '\n';

    return 0;
}

虽然,如果你想真正通用,默认构造函数的要求可能是一个问题。在这种情况下,您通常会给调用者一些方法来指定默认值。如:

template <class A, class B>
void zero(std::pair<A, B>& p, A a = A(), B b = B())
{
    p.first = a;
    p.second = b;
}
于 2013-04-12T04:32:19.703 回答