解释为什么在使用类模板时,当我在pop()和push()方法调用期间传递 const char* 类型的参数时没有发生错误。在这些方法中,形式参数是type& ——即引用。创建函数定义时,参数类型设置为 const char*。但是 & 消失到哪里了?当我简单地指定函数模板类型 Type(意味着它将接收一个 const char* 值)时,就会发生错误。
添加。问题: 该函数模板是如何以及何时创建的?在创建类时,它是否向方法传递任何信息,例如类型?为什么如果我已经指定了类空间,还必须在pop()函数中为返回值指定模板类型。
1 个文件(标题)
#ifndef STACKTP_H_
#define STACKTP_H_
template <class Type>
class Stack {
private:
enum { MAX = 10 }; // default size
Type* items; // cодержит элементы стека
int top; // индекс вершины стека
int stacksize;
public:
explicit Stack(int ss = SIZE) { items = new Type[stacksize]; }
bool push(const Type& item); // добавляет элемент в стек
bool pop(Type& item); // выталкивает элемент с вершины стека
//方法的实现
**// почему работает при передаче аргумента const char*?**
template <class Type>
bool Stack<Type>::push(const Type& item)
{
if (top < stacksize)
{
items[top++] = item;
return true;
}
else
return false;
}
**// почему работает при передаче аргумента const char*?**
template <class Type>
bool Stack<Type>::pop(Type& item)
{
if (top > 0)
{
item = items[--top];
return true;
}
else
return false;
}
#endif
主要的
int nextin = 0;
const char* in[Num] =
{
" 1: Hank Gilgamesh", " 2: Kiki Ishar", " 3: Betty Rocker", "
4: Ian Flagranti",
" 5: Wolfgang Kibble", " 6: Portia Koop", " 7: Joy Almondo", "
8: Xaverie Paprika",
" 9: Juan Moore", " 10: Misha Mache"
};
st.push(in[nextin++]);
它并没有消失在任何地方。您有一个类型的变量
const char*并通过引用传递它。在引擎盖下(我不知道俄语中正确的对应词)链接通常是指针,即基本上,您正在将一个指针传递给一个指针。也许这样说会更清楚:也就是说,函数通过引用
push()接受一个变量item,并且该变量的类型item为const char*。您的例子中也有同样的事情。最小示例:https://godbolt.org/z/E9GEWrW4j
或者如果你只是通过引用(而不是 const)传递:
这使您可以更改指针指向的位置,因为您实际上是将指针传递给指针。 (但你不要告诉任何人这件事。在 C++ 中,说引用是指针被视为禁忌,因为标准并没有直接说明这一点。这就像《哈利波特》中那个不愿透露姓名的人的名字。)
最小示例:https://godbolt.org/z/bz1W73nKf。
我不太明白你的意思。如果是这样:
那么一切都正常。例如:https://godbolt.org/z/6Kx3Ev41j。如果你尝试这样做:
那么它将无法工作,因为
push()它不是一个函数模板,而是一个常规函数(尽管在类模板中)。这发生在编译时。当编译器看到模板的使用时,它会推断模板参数的类型并创建函数/类的重载,用推断出的类型替换参数。
不,它只是创建了函数的重载并用推导的类型替换模板参数。
抱歉,我不明白这个问题。