不能超载功能

时间:2012-06-29 20:27:31

标签: c++ templates specialization

所以我有一个模板化的类,当我有特定的类型时,我想重载一个函数的行为,比如说char。对于所有其他类型,让他们做自己的事情。但是,c ++不会让我重载该函数。

为什么我不能重载此功能?我真的不是想要做模板专业化,因为那时我已经复制了整个班级。

以下是展示问题的玩具示例:http://codepad.org/eTgLG932

为了您的阅读乐趣,这里张贴了相同的代码:

#include <iostream>
#include <cstdlib>
#include <string>

struct Bar
{
  std::string blah() { return "blah"; }
};

template <typename T>
struct Foo
{
public:
  std::string doX()
  {
    return m_getY(my_t);
  }

private:
  std::string m_getY(char* p_msg)
  {
    return std::string(p_msg);
  }

  std::string m_getY(T* p_msg)
  {
    return p_msg->blah();
  }

  T my_t;
};

int main(int, char**)
{
  Foo<char> x;
  Foo<Bar> y;
  std::cout << "x " << x.doX() << std::endl;
  return EXIT_SUCCESS;
}

谢谢大家的建议。提出了两种有效的解决方案。我可以专门化doX方法,也可以专门化m_getY()方法。

在一天结束时,我宁愿保持我的专业而不是公开,所以我接受了Krill的回答。

4 个答案:

答案 0 :(得分:7)

您可以在特定类型的整个模板类中专门使用一个函数,而无需专门化整个类。它看起来像这样:

template <> void Foo<char>::doX() {
     /* custom implementation here */
}

你很少在实践中看到这一点,但这完全是合法的C ++代码。

希望这有帮助!

答案 1 :(得分:3)

  std::string m_getY(char* p_msg)
  {
    return std::string(p_msg);
  }

  std::string m_getY(T* p_msg)
  {
    return p_msg->blah();
  }

这里的问题是当Tchar时,您最终会得到两个具有相同签名的函数。

答案 2 :(得分:1)

您可以将方法m_getY设为成员函数模板。他们使char*的这个函数模板专门化,或者只是定义一个带有char*参数的方法。在这种情况下,您不必复制整个班级。

答案 3 :(得分:1)

std::string m_getY(char* p_msg)
{
  return std::string(p_msg);
}

template<typename U> 
std::string m_getY(U* p_msg)
{
  return p_msg->blah();
}

不会相互冲突(前者后者的特化,因为它不是模板)