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

Sam*_*rsa 3 c++ templates typedef visual-studio-2008

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

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
};
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是,这不编译.编译器抱怨它无法将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
Run Code Online (Sandbox Code Playgroud)

然后编译器很高兴.我认为这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);
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 5

以下代码编译正常:

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

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

更新2

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

问题是这个:

typedef T *U;
const U x;
Run Code Online (Sandbox Code Playgroud)

是不一样的:

const T *x;
Run Code Online (Sandbox Code Playgroud)

它实际上与:

T *const x;
Run Code Online (Sandbox Code Playgroud)

  • @Samaursa:好的,我再次更新了.将来,当您提出问题时,请发布您的**确切**,**实际**代码... (2认同)