Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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_Exception_Exception Handling - Fatal编程技术网

C++ C++;异常语法

C++ C++;异常语法,c++,templates,exception,exception-handling,C++,Templates,Exception,Exception Handling,我很难理解异常的语法。我有一个类模板map,它必须能够抛出异常。下面的代码是正确的,用于捕获异常 try { map<int> m; m["everything"] = 42; } catch(map<int>::Uninitialized&) { cout << "Uninitialized map element!" << endl; } 假设您正在创建一个map类型(尽管标准库已经提供了一个)。

我很难理解异常的语法。我有一个类模板
map
,它必须能够抛出异常。下面的代码是正确的,用于捕获异常

try
{       
    map<int> m;
    m["everything"] = 42;
}
catch(map<int>::Uninitialized&)
{
    cout << "Uninitialized map element!" << endl;
}

假设您正在创建一个
map
类型(尽管标准库已经提供了一个)。您提供了
操作符[]
,并希望它在每次有人试图访问不存在的密钥时抛出异常

创建您的异常类:

class unititialized_access : public std::runtime_error
{
    // typical stuff
};
然后,在
map::operator[]
中:

if (<key doesn't exist>)
    throw unititialized_error("blah blah");

你试图做什么的基本想法当然是可能的,所以你遇到的确切问题并不完全清楚

下面是一个快速演示,它确实有效,并且大致完成了您似乎正在尝试的内容:

#include <stdexcept>
#include <iostream>

template <class T>
class map { 
public:
    class Uninitialized : public std::runtime_error
    {
    public:
        Uninitialized() : runtime_error("error") {}
    };

    T operator[](const char index[]) const
    {
        throw Uninitialized();
        return T();
    }
};

int main(){ 
    map<int> m;
    try {
        auto foo = m["a"];
    }
    catch (map<int>::Uninitialized &m) {
        std::cerr << "Caught exception:" << m.what()<< "\n";
    }
}
#包括
#包括
模板
类映射{
公众:
类未初始化:public std::runtime\u错误
{
公众:
Uninitialized():运行时错误(“错误”){
};
T运算符[](常量字符索引[])常量
{
抛出未初始化();
返回T();
}
};
int main(){
地图m;
试一试{
自动foo=m[“a”];
}
捕获(映射::未初始化(&m){

你得到了什么编译器错误?你的预期结果是什么,你实际得到了什么?请澄清你的问题。错误比我能计算的要多。我基本上知道如何使用捕获异常的代码。我相信这个问题与我跟踪的方式有关。旁白:考虑到如果已经有一个
std::map
,您最好使用另一个名称。您的逻辑在什么方面似乎有缺陷?前提是什么,得出了什么结论?捕获异常的方式与抛出异常的方式相对应。它被捕获为未命名的非常量引用?我不应该这样做更改此行:catch(map::Uninitialized&)我的类必须被构建,这样才能使用它。好吧,让
未初始化错误
成为
map
的一员。我相信问题与此相关。现在尝试解决它。Downvoter:想解释一下你在这里看到的问题吗?如果有真正的问题,我想解决它…15.3/17似乎与你的断言相矛盾at非常量引用不能绑定到临时引用。无论
throw
表达式中的异常是否为临时异常,它都用于初始化异常对象,该异常对象肯定是临时异常(15.1/3)。此外,用户对该问题的第一个评论表明,该问题是由于在异常中添加了
运行时\u错误
基类而导致的编译器错误。我不认为抛出或捕获的方法发生了更改。代码是否一直不正确?如果没有,更改的祖先会如何影响它?我相信Rob是正确的。(参见示例…)我认为您可以通过非常量引用捕获异常,否则Boost.exception就没有多大意义了。@RobKennedy:是的--至少在这一点上是正确的(不能删除,因为它已被接受)。
try
{
    m["foo"] = 42;
}
catch (const unitialized_error& e)
{
    // do something
}
#include <stdexcept>
#include <iostream>

template <class T>
class map { 
public:
    class Uninitialized : public std::runtime_error
    {
    public:
        Uninitialized() : runtime_error("error") {}
    };

    T operator[](const char index[]) const
    {
        throw Uninitialized();
        return T();
    }
};

int main(){ 
    map<int> m;
    try {
        auto foo = m["a"];
    }
    catch (map<int>::Uninitialized &m) {
        std::cerr << "Caught exception:" << m.what()<< "\n";
    }
}