【问题标题】:C++ Cannot call function with stack templateC ++无法使用堆栈模板调用函数
【发布时间】:2021-01-14 21:44:39
【问题描述】:

请告诉我可能是什么问题。我有 2 个自己的堆栈类(stackm 和 stackl)和堆栈排序功能:

template <class TStack>
void quick_sort_stack(TStack &s, TStack L, TStack G, TStack E) {
// Sort stack
}

为了对数组进行排序,我调用了函数:

template <typename T>
void quick_sort_stack(stackm<T> &s) {
    quick_sort_stack(s, stackm<T>(s.size()), stackm<T>(s.size()), stackm<T>(s.size()));
}

template <typename T>
void quick_sort_stack(stackl<T> &s) {
    quick_sort_stack(s, stackl<T>(), stackl<T>(), stackl<T>());
}

而且它有效。但是当我尝试对 std::stack 做同样的事情时

template <typename T>
void quick_sort_stack(std::stack<T> &s) {
    quick_sort_stack(s, std::stack<T>(), std::stack<T>(), std::stack<T>());
}

我收到错误:

(no matching function for call to quick_sort_stack(std::stack<int> &, std::stack<int>, std::stack<int>, std::stack<int>)):

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 当您重新排序函数模板时会发生什么?您是否尝试将实现功能放在包装器之上?
  • @storyteller-unslander-monica 是的,它确实有效。不过这很奇怪,因为它们都在主要的排序功能之上。非常感谢。
  • 嗯,C++ 对名称查找非常讲究。所以通常情况下,除非在第一个使用点之前声明它们,否则它们是不可见的。
  • 奇怪的是其余选项都起作用了,尽管它们在上面。

标签: c++ function sorting templates stack


【解决方案1】:

我有这样的结构:

template <typename T>
void quick_sort_stack(stackm<T> &s) {
    quick_sort_stack(s, stackm<T>(s.size()), stackm<T>(s.size()), stackm<T>(s.size()));
}

template <typename T>
void quick_sort_stack(stackl<T> &s) {
    quick_sort_stack(s, stackl<T>(), stackl<T>(), stackl<T>());
}

template <typename T>
void quick_sort_stack(stack<T> &s) {
    quick_sort_stack(s, stack<T>(), stack<T>(), stack<T>());
}

template <class TStack>
void quick_sort_stack(TStack &s, TStack L, TStack G, TStack E) {
    // Sorted function
}

将排序功能移到其余部分后程序开始:

template <class TStack>
void quick_sort_stack(TStack &s, TStack L, TStack G, TStack E) {
    // Sorted function
}

template <typename T>
void quick_sort_stack(stackl<T> &s) {
    quick_sort_stack(s, stackl<T>(), stackl<T>(), stackl<T>());
}
// Another...

【讨论】:

  • 它适用于您的类stackl/stackm 的原因是因为它们与您的quick_sort_stack(TStack &amp;s, TStack L, TStack G, TStack E) 函数位于同一命名空间中。看ADL
  • @Jarod42 我已经在文件开头明确指出使用 std::stack : using std::stack;
  • 所以你可以使用stack而不用拼写std::stack,但是foo(stack())仍然在之前的声明中搜索foo当前命名空间和命名空间std。我只是想快速解释一下您的 ADL 问题。
猜你喜欢
  • 2012-04-14
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多