C++ C++;无法使用堆栈模板调用函数

C++ C++;无法使用堆栈模板调用函数,c++,function,sorting,templates,stack,C++,Function,Sorting,Templates,Stack,请告诉我有什么问题。我有两个自己的堆栈类(stackm和stackl)和堆栈排序函数: template <class TStack> void quick_sort_stack(TStack &s, TStack L, TStack G, TStack E) { // Sort stack } 模板 无效快速排序堆栈(TStack&s、TStack L、TStack G、TStack E){ //排序堆栈 } 要对数组进行排序,我调用以下函数: template <

请告诉我有什么问题。我有两个自己的堆栈类(stackm和stackl)和堆栈排序函数:

template <class TStack>
void quick_sort_stack(TStack &s, TStack L, TStack G, TStack E) {
// Sort stack
}
模板
无效快速排序堆栈(TStack&s、TStack L、TStack G、TStack E){
//排序堆栈
}
要对数组进行排序,我调用以下函数:

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>());
}
模板
无效快速排序堆栈(堆栈建模与仿真){
快速排序栈(s,stackm(s.size()),stackm(s.size()),stackm(s.size());
}
模板
无效快速排序堆栈(堆栈L&s){
快速排序栈(s,stackl(),stackl(),stackl());
}
它是有效的。但是当我尝试对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>());
}
模板
无效快速排序堆栈(标准::堆栈&s){
快速排序堆栈(s,std::stack(),std::stack(),std::stack());
}
我得到一个错误:

(no matching function for call to quick_sort_stack(std::stack<int> &, std::stack<int>, std::stack<int>, std::stack<int>)):
(没有用于调用快速排序堆栈(std::stack&,std::stack,std::stack,std::stack,std::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>());
}

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
}
模板
无效快速排序堆栈(堆栈建模与仿真){
快速排序栈(s,stackm(s.size()),stackm(s.size()),stackm(s.size());
}
模板
无效快速排序堆栈(堆栈L&s){
快速排序栈(s,stackl(),stackl(),stackl());
}
模板
无效快速排序堆栈(堆栈&s){
快速排序\u堆栈(s,stack(),stack(),stack());
}
模板
无效快速排序堆栈(TStack&s、TStack L、TStack G、TStack E){
//排序函数
}
将排序功能移到其余部分后,程序启动:

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...
模板
无效快速排序堆栈(TStack&s、TStack L、TStack G、TStack E){
//排序函数
}
模板
无效快速排序堆栈(堆栈L&s){
快速排序栈(s,stackl(),stackl(),stackl());
}
//另一个。。。

重新订购函数模板时会发生什么?您是否尝试将实现函数置于包装器之上?请提供一个@storyteller unslander monica是的,它确实起作用了。但这很奇怪,因为它们都在主排序函数之上。非常感谢。C++对名称查找非常特别。因此,通常情况下,除非在第一个使用点之前声明,否则事物是不可见的。奇怪的是,其余的选项都可以工作,尽管它们在上面。它对类
stackl
/
stackm
起作用的原因是它们与
快速排序堆栈位于同一命名空间中(TStack&s,TStack L,TStack G,TStack E)
函数。请看。@Jarod42我在文件开头明确指出了std::stack的用法:使用std::stack;因此您可以使用
stack
而不必拼写
std::stack
,但
foo(stack())
仍然在前面的声明中搜索当前名称空间和名称空间
std
。我只想快速解释一下您的ADL问题。