gpt4 book ai didi

c++ - 为什么 typedef 会影响函数重载?

转载 作者:太空狗 更新时间:2023-10-29 20:30:18 26 4
gpt4 key购买 nike

我在一个类中有两个函数(请评论问题而不是编码风格):

template <typename T>
class myStringClass
{
public:
...

typedef T* iterator;

void erase(size_t pos, size_t n); // FUNC#1
void erase(iterator first, iterator last); //FUNC#2
};

FUNC#2 正在删除范围,而 FUNC#1 在计算出适当的范围后简单地调用 FUNC#2。在 FUNC#1 中,我没有声明 iterator 来计算范围,而是声明了 T*,这(应该是?)本质上是一样的。

// SEGMENT#1 in function erase(size_t pos, size_t n)
T* begin = m_begin + pos;
T* end = begin + n;
erase(begin, end); // call FUNC#2

但是,这不会编译。编译器提示它无法将 T*(其中 T 是一个字符)转换为 size_t(即试图调用 `FUNC#1)。但是如果我把上面的代码改成:

// SEGMENT#2 in function erase(size_t pos, size_t n)
iterator begin = m_begin + pos;
iterator end = begin + n;
erase(begin, end); // call FUNC#2

然后编译器很高兴。我假设 typedef 是一个别名并且没有进行类型检查。那么 SEGMENT#1 == SEGMENT#1 就编译器而言?为什么一个能编译而另一个不能?


编辑: 在测试 Oli 的代码后,我将其与我的代码进行了核对,但我忘记将 const 添加到 SEGMENT#2 中的迭代器中。除了在这种情况下添加 const 没有意义的论点之外,为什么会产生 T* 而不是 iterator 的错误。如果您想尝试一下,请对 Oli 的代码稍作修改:

#include <stdlib.h>

template <typename T>
class myStringClass
{
private:
T *m_begin;

public:

typedef T* iterator;

void erase(size_t pos, size_t n); // FUNC#1
void erase(iterator first, iterator last); //FUNC#2
};


template <typename T>
void myStringClass<T>::erase(size_t pos, size_t n)
{
const T* begin = m_begin + pos; // replace with iterator to compile
const T* end = begin + n; // replace with iterator to compile
erase(begin, end); // call the overload
}


template <typename T>
void myStringClass<T>::erase(const iterator first, const iterator last)
{
}

int main(void)
{
myStringClass<char> x;
x.erase(1,1);
}

最佳答案

以下代码compiles fine :

#include <stdlib.h>

template <typename T>
class myStringClass
{
private:
T *m_begin;

public:

typedef T* iterator;

void erase(size_t pos, size_t n); // FUNC#1
void erase(iterator first, iterator last); //FUNC#2
};


template <typename T>
void myStringClass<T>::erase(size_t pos, size_t n)
{
T* begin = m_begin + pos;
T* end = begin + n;
erase(begin, end); // call the overload
}


template <typename T>
void myStringClass<T>::erase(iterator first, iterator last)
{
}


int main(void)
{
myStringClass<char> x;
x.erase(1,1);
}

你的问题一定出在别处。

更新

现在您已经展示了您的真实代码...

问题是您试图通过传递 const 指针来调用一个采用非 const 指针的函数。这是无效的。

更新 2

现在您已经展示了“真正的”代码...

问题在于:

typedef T *U;
const U x;

不同于:

const T *x;

实际上是一样的:

T *const x;

关于c++ - 为什么 typedef 会影响函数重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com