【问题标题】: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 的值是多少?
  • 你确定你只有一个错误吗?

标签: c++ class templates arguments main


【解决方案1】:

您的calc 函数是一个带有参数T 的函数模板,但该参数不被任何函数参数使用——唯一的参数被定义为string,无论T 是什么类型是。

因此,当您像这样调用calc 时,编译器无法延迟T

calc(input())

您需要明确指定T,例如:

calc<int>(input())

(当然,您应该使用任何有意义的数据类型,而不是int。)

【讨论】:

  • 我更新了我的帖子以表明我在函数中使用了 T。这会让事情变得更好吗? ://
  • @NimaGanjehloo 不,很遗憾没有。只有将类型用作函数的参数,才能延迟该类型。在函数内部的某个地方使用它(或者甚至作为返回类型,但不是作为参数)是不够的。
  • 在这种情况下,我将如何在 calc 函数中创建一个接受任何类型的变量?
  • 嗯...我认为这里对模板是什么有一些误解。用于T 的类型必须在编译时已知。 (在您编写calc 时不需要知道它,但在您编写调用calc 的代码时,它必须被定义——或者以calc 的参数之一的形式,或者通过在我的回答中明确指定它。)只要考虑一下当编译器到达calc 中使用T 的点时应该做什么。它应该如何知道使用什么类型?
  • 这解释了很多哈哈。看来我必须退后几步,重新考虑我正在做的一切。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多