使用继承std :: exception的嵌套类抛出异常

时间:2016-10-23 17:12:15

标签: c++ xcode data-structures

我正在编写自己的Tree数据结构。 在我的parent()函数中,我想抛出我创建的no_parent异常。所有函数都在Tree.cpp文件中实现。

  

Tree.hpp

List<WebElement> homeEvents = body.findElements(By.className(".summary-vertical.fl"));

但是当我以这种方式在Tree.cpp文件中实现no_parent时

#ifndef Tree_hpp
#define Tree_hpp

#include <stdio.h>
#include <vector>
using namespace std;

template<typename T>
class Tree{
    class Node;
    class no_parent : public std::exception {
        virtual const char* what() const _NOEXCEPT
        {
            return "no_parent";
        }
    };

protected:
    Node* rootNode;
    Node* currentNode;
    int _size;
public:
    Tree();
    void addChild(T* childElem);
    void removeChild(int index) throw (out_of_range);
    bool empty();
    int size();
    Tree& root();
    bool isRoot();
    bool isExternal();
    Tree& parent() throw(no_parent);
    Tree& child(int index) throw(out_of_range);
    int getChildrenNum();
    int getChildrenNum(Node* node);
};
#endif /* Tree_hpp */

我从parent()函数获取错误消息“在异常规范中不允许使用不完整类型'Tree :: no_parent'”。 如何在Tree.hpp文件外实现no_parent?

2 个答案:

答案 0 :(得分:0)

您无法根据源文件中的模板参数实现方法,该文件从不包含在需要该类实例的位置。您要么必须包含源文件,要么立即在标题中实现您的方法。有关详细信息,请参阅this question

答案 1 :(得分:0)

我希望您的企业需要您在类Tree中拥有嵌套类和前向声明。我不在乎他们。

但是你的代码可以正常运行&#34; noexcept&#34;来自C ++ 11的关键字。 http://en.cppreference.com/w/cpp/language/noexcept

我想&#34; _NOEXCEPT&#34;不再存在了。可能在非常具体的编译器中保持向后兼容性。

我对您的代码进行了一些更改并进行了测试,运行正常。请在下面找到详细信息。

删除&#34; stdio&#34;并替换了&#34; iostream&#34;,仅处理C ++(至少问题标签说)

注释了一些缺少变量声明的函数。

这是代码。试试吧。

#include <iostream>
using namespace std;

template<typename T>
class Tree{
    class Node;
    class no_parent : public std::exception {
        //Added "noexcept" key word here.
        virtual const char* what() const noexcept
        {
            return "no_parent";
        }
    };

protected:
    Node* rootNode;
    Node* currentNode;
    int _size;
public:
    Tree();
    void addChild(T* childElem);
   // void removeChild(int index) throw (out_of_range);
    bool empty();
    int size();
    Tree& root();
    bool isRoot();
    bool isExternal();
    Tree& parent() throw(no_parent);
    //Tree& child(int index) throw(out_of_range);
    int getChildrenNum();
    int getChildrenNum(Node* node);
};

int main()
{
    return 0;
}