【问题标题】:class function partial specialization with templated argument具有模板化参数的类函数偏特化
【发布时间】:2013-10-24 07:57:28
【问题描述】:

我想要一个 Queue 模板类,它可以通过模板参数指定内部容器结构并专门化 Top 函数(因为不同的容器使用不同的函数名来访问前面的项目),如以下代码:

template<class I, class C = std::queue<I>>
class Queue
{
    C items;
public:
    I* Top()
    {
        std::cout << "this is a queue" << std::endl;
        return &items.front();
    }
};

template<class I>
void I* Queue<I, std::priority_queue<I>>::Top()
{
    std::cout << "this is a priority_queue" << std::endl;
    return &items.top();
}

但是,这段代码会导致很多编译错误。有没有人可以给我一个提示,我是否会进入设计模板类的错误方向?谢谢。

【问题讨论】:

  • 究竟什么是void I*?无论如何,items 属于 C 类型,单个成员函数中没有任何魔法可以改变这一点。
  • 哎呀...对不起...这是一个错字。 Top() 函数的返回类型应该是 I* 而不是 void I*。

标签: c++ templates containers specialization


【解决方案1】:

您正在尝试对(成员)函数模板进行部分特化。函数模板不能在 C++ 中部分特化。您必须对整个课程进行部分专业化,或者找到其他方法来做您想做的事。例如,您可以在Top() 中使用特征:

I* Top()
{
    return MyQueueTraits<I, C>::GetTop(items);
}

template <class I, class C>
struct MyQueueTraits
{
  static I* GetTop(C &c) { return &c.front(); }
};

template <class I>
struct MyQueueTraits<I, std::priority_queue<I>>
{
  static I* GetTop(std::pirority_queue<I> &c) { return &c.top(); }
};

【讨论】:

  • 是的!它适用于我的实施。非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多