模板类和主要
Posted
技术标签:
【中文标题】模板类和主要【英文标题】:Template Classes and main 【发布时间】:2012-09-30 12:58:12 【问题描述】:我有以下类设置,尝试模仿一个非常基本的堆栈。
template <class T>
class Stack
public:
static const unsigned MAX_STACK_DEPTH =4;
Stack();
unsigned elements() const;
Stack<T> & push(T &value);
T pop();
Stack<T> & show();
private:
unsigned element;
T stack[MAX_STACK_DEPTH];
;
template <class T>
Stack<T>::Stack()
element=0;
/*Other class function definitions*/
我的问题是我在 main 中收到以下错误
1 IntelliSense: no instance of function template "calc" matches the argument list c:\users\nima\documents\visual studio 2010\projects\calcu\calcu\policalc.cpp 109 6 Calcu
这是我的主要内容
int main()
bool run=true;
while(run)
if(calc(input()));
这是另外两个函数声明
string input();
template <class T>
bool calc(string line);
这是我的 calc 函数,还没完成。
template <class T>
bool calc(string line)
static T Ans;
istringstream sin(line);
Stack stack;
for(string token; sin>>token)
T t;
if(parse(t, token))
push(t);
else
if(token==operators[i])
switch(i)
case 1:
【问题讨论】:
如果 calc() 没有在其签名中使用 T,为什么它被声明为模板函数?我没有看到您在 main 中使用类 Stack 的位置。 你提供的堆栈模板在这里没用。但没有提供有用的计算实现。 我用 calc 函数更新了帖子。这有帮助吗? :/ 对此感到抱歉。 编译器如何知道你想要 calc 调用的 T 的值是多少? 你确定你只有一个错误吗? 【参考方案1】:您的calc
函数是一个带有参数T
的函数模板,但该参数不被任何函数参数使用——唯一的参数被定义为string
,无论T
是什么类型是。
因此,当您像这样调用calc
时,编译器无法延迟T
:
calc(input())
您需要明确指定T
,例如:
calc<int>(input())
(当然,您应该使用任何有意义的数据类型,而不是int
。)
【讨论】:
我更新了我的帖子以表明我在函数中使用了 T。这会让事情变得更好吗? :// @NimaGanjehloo 不,很遗憾没有。只有将类型用作函数的参数,才能延迟该类型。在函数内部的某个地方使用它(或者甚至作为返回类型,但不是作为参数)是不够的。 在这种情况下,我将如何在 calc 函数中创建一个接受任何类型的变量? 嗯...我认为这里对模板是什么有一些误解。用于T
的类型必须在编译时已知。 (在您编写calc
时不需要知道它,但在您编写调用calc
的代码时,它必须被定义——或者以calc
的参数之一的形式,或者通过在我的回答中明确指定它。)只要考虑一下当编译器到达calc
中使用T
的点时应该做什么。它应该如何知道使用什么类型?
这解释了很多哈哈。看来我必须退后几步,重新考虑我正在做的一切。感谢您的帮助。以上是关于模板类和主要的主要内容,如果未能解决你的问题,请参考以下文章