Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除警告:";变量';结果';每当';如果';“条件为假”;在c++;_C++_Templates_Stack - Fatal编程技术网

C++ 删除警告:";变量';结果';每当';如果';“条件为假”;在c++;

C++ 删除警告:";变量';结果';每当';如果';“条件为假”;在c++;,c++,templates,stack,C++,Templates,Stack,我见过类似的问题,但没有一个对我有帮助,因为我找不到一个使用模板的问题。 对于家庭作业,我必须编写一个可以与任何类型的变量一起使用的堆栈,因此我决定使用一个模板。这就阻止了我初始化变量,我的代码给了我一个函数pop()的警告,有人能给我一些关于如何删除此类警告的建议吗 我的函数pop(): 模板 T stack::pop(){ T结果; 如果(!empty()){ 结果=tos->数据; 节点*tmp=tos; tos=tos->next; 删除tmp; }否则{ std::cerr而不是简单地

我见过类似的问题,但没有一个对我有帮助,因为我找不到一个使用模板的问题。 对于家庭作业,我必须编写一个可以与任何类型的变量一起使用的堆栈,因此我决定使用一个模板。这就阻止了我初始化变量,我的代码给了我一个函数pop()的警告,有人能给我一些关于如何删除此类警告的建议吗

我的函数pop():

模板
T stack::pop(){
T结果;
如果(!empty()){
结果=tos->数据;
节点*tmp=tos;
tos=tos->next;
删除tmp;
}否则{

std::cerr而不是简单地打印到
std::cerr
您的
pop()
方法如果遇到无法处理的问题,应该引发异常。静默失败并返回未初始化的对象将在以后引起问题

您可以引发如下异常:

/。。。
否则{
抛出std::运行时_错误(“错误空堆栈”);
}
//...

然后,您只需在if语句的
true
分支中声明
result

提示:不要删除警告。请先修复错误,然后将
result
初始化为一个值,然后再使用它。没有初始化,根据类型
T
,定义
T result
可以离开
T
未初始化-例如,如果
T
int
。如果
!empty()
不是true,则到达
else
,使
结果未初始化。
返回结果将具有未定义的行为(因为它访问未初始化变量的值)。我不相信初始化t是可能的,因为没有我可以预测的类型,我必须在这个项目的未来部分同时使用我们实现的string类和int。我想不出一种方法来初始化它,这样它就可以对这两个类都起作用。据我所知,我的string类将被初始化为默认构造函数的规范,而int将被单位化。值得注意的是,我们选择了单独的
get_back
pop_back
方法,因为
pop
在空的情况下以一种有用的方式处理可能有点棘手。现在可能会抛出一个异常或返回一个异常!谢谢!我的教授最后也回答了我的问题上周我发了一封电子邮件,显然我可以在从堆栈中弹出元素之前使用断言(!empty()),不过我会使用这个,因为它看起来更整洁。
template<typename T>
    T stack<T>::pop(){
        T result;
        if(!empty()){
            result = tos->data;
            Node<T> *tmp = tos;
            tos = tos->next;
            delete tmp;
        }else{
            std::cerr<<"ERROR empty stack"<<std::endl;
        }
        return result;
    }