热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我在课堂上有两个功能(请评论问题,而不是编码风格):templateclassmyStringClass{public:typedefT*iterato

我在课堂上有两个功能(请评论问题,而不是编码风格):

template
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而不是声明迭代器来计算范围,我声明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是一个char)转换为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 *而不是迭代器的错误.如果你想尝试一下,这里是Oli的代码稍作修改:

#include
template
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
void myStringClass::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
void myStringClass::erase(const iterator first, const iterator last)
{
}
int main(void)
{
myStringClass x;
x.erase(1,1);
}

解决方法:

以下代码compiles fine:

#include
template
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
void myStringClass::erase(size_t pos, size_t n)
{
T* begin = m_begin + pos;
T* end = begin + n;
erase(begin, end); // call the overload
}
template
void myStringClass::erase(iterator first, iterator last)
{
}
int main(void)
{
myStringClass x;
x.erase(1,1);
}

你的问题必须在其他地方.

UPDATE

现在你已经展示了真正的代码……

问题是你试图通过传递const指针来调用一个带非常量指针的函数.这是无效的.

更新2

现在你已经展示了你的“真实”代码……

问题是这个:

typedef T *U;
const U x;

是不一样的:

const T *x;

它实际上与:

T *const x;


推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有