带有模板参数的自定义C ++异常

医学物理学家

我正在尝试学习如何将自定义C ++异常与模板参数一起使用。这是我尝试无法成功编译的虚拟程序:

#include <string>
#include <iostream>

template <class T>
class MyException : public std::exception {
    public:
        T error;
        MyException(T err) { error = err; };
};


int main(void) {
    try {
        std::string err = "String error";
        throw MyException<std::string>(err);
        return 0;
    }
    catch (MyException e) {
        std::cout << e << std::endl;
        return 1;
    };
}

这是我得到的错误:

<source>: In function 'int main()':
<source>:18:9: error: invalid use of template-name 'MyException' without an argument list
   18 |  catch (MyException e) {
      |         ^~~~~~~~~~~
<source>:18:9: note: class template argument deduction is only available with '-std=c++17' or '-std=gnu++17'
<source>:5:7: note: 'template<class T> class MyException' declared here
    5 | class MyException : public std::exception {
      |       ^~~~~~~~~~~
<source>:19:22: error: 'e' was not declared in this scope
   19 |         std::cout << e << std::endl;
      |                      ^

您能帮我为C ++ 11修复它吗?

马雷克

您找不到任何模板!您只能捕获特定类型,因此只能捕获模板的特定实例。因此,您的代码应如下所示(快速修复):

#include <string>
#include <iostream>

template <class T>
class MyException : public std::exception {
    public:
        T error;
        MyException(T err) { error = err; };
};


int main(void) {
    try {
        std::string err = "String error";
        throw MyException<std::string>(err);
        return 0;
    }
    catch (const MyException<std::string>& e) {
        std::cout << e.what() << std::endl;
        return 1;
    };
}

https://godbolt.org/z/P4czdP

如果您需要某种方式来捕获此模板的所有异常,则需要额外的继承层以为此模板引入通用的唯一父类型:

#include <string>
#include <iostream>


class MyCommonException : public std::exception
{};

template <class T>
class MyException : public MyCommonException {
    public:
        T error;
        MyException(T err) { error = err; };
};


int main(void) {
    try {
        std::string err = "String error";
        throw MyException<std::string>(err);
        return 0;
    }
    catch (const MyCommonException& e) {
        std::cout << e.what() << std::endl;
        return 1;
    };
}

https://godbolt.org/z/xz8r5a

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确创建带有消息的自定义异常?

来自分类Dev

带有弹簧启动的自定义异常句柄

来自分类Dev

带有预抛出钩子的自定义异常?

来自分类Dev

捕获自定义异常C ++

来自分类Dev

自定义异常消息C#

来自分类Dev

C#,自定义异常的用法

来自分类Dev

自定义UITableViewCell异常

来自分类Dev

自定义异常-Java

来自分类Dev

自定义光标异常?

来自分类Dev

自定义Zuul异常

来自分类Dev

自定义异常的问题

来自分类Dev

自定义异常处理

来自分类Dev

自定义异常不断给我“异常:未知异常”

来自分类Dev

'NSInvalidArgumentException',原因:'-[UIImageView _isResizable]带有自定义表格视图单元格的异常

来自分类Dev

带有自定义键的NSDictionary的行为异常-值偶尔会更改为null并返回

来自分类Dev

Java中带有新行的自定义异常消息

来自分类Dev

我可以创建带有另一个异常的自定义异常(类似于Java中的“ causedby”)

来自分类Dev

如何在django rest框架中快速抛出带有自定义错误代码的自定义异常并覆盖异常响应中的默认字段

来自分类Dev

自定义球衣参数引发异常时发生MultiException

来自分类Dev

将参数传递给自定义异常

来自分类Dev

C ++:如何将参数传递给自定义异常?

来自分类Dev

Laravel 5.1自定义异常上的自定义参数

来自分类Dev

具有自定义结构的PInvoke访问冲突异常

来自分类Dev

python自定义现有的内置异常

来自分类Dev

具有通用类型的自定义异常

来自分类Dev

具有绑定变量的自定义Spring异常

来自分类Dev

python自定义现有的内置异常

来自分类Dev

具有功能的自定义异常

来自分类Dev

将关键字参数传递给自定义异常-异常

Related 相关文章

热门标签

归档