Visual C+中的函数try块+;2008 > >编辑2 :如果我将方法定义移入类定义之外,VisualC++ 2008就正确编译了。< /P>
我尝试了以下代码:Visual C+中的函数try块+;2008 > >编辑2 :如果我将方法定义移入类定义之外,VisualC++ 2008就正确编译了。< /P>,c++,visual-studio,C++,Visual Studio,我尝试了以下代码: class Foo { public: void f() try {} catch ( ... ) {} }; 但编译器会打印此错误: error c2590: 'f' : only a constructor can have a base/member initializer list 相同的语法(根据标准有效)在自由函数中工作 该代码在较新版本的VisualStudio和gcc上编译 编辑:不,在我的代码中没有输入错误。C++标准称它是一个有
class Foo
{
public:
void f()
try {}
catch ( ... ) {}
};
但编译器会打印此错误:
error c2590: 'f' : only a constructor can have a base/member initializer list
相同的语法(根据标准有效)在自由函数中工作
该代码在较新版本的VisualStudio和gcc上编译
编辑:不,在我的代码中没有输入错误。C++标准称它是一个有效的语法。它被称为“函数试块”
< > > >编辑2 <强>:如果我将方法定义移入类定义之外,VisualC++ 2008就正确编译了。< /P>
谢谢。此功能仅对构造函数在成员变量的内联初始化中捕获异常有效,例如:
struct a {
a(const complex_object& value)
: m_var(value)
{}
private:
complex_object m_var;
};
如果在复杂_对象的复制构造函数中有异常抛出,则无法处理(如果不更改m_var的初始化,则不会)
在这种情况下,函数try block用于处理此类异常,保持相同的初始化
在您的例子中,方法f不是类Foo的构造函数
Daniele是对的,函数Try块可以在方法中使用,但通常这不会有多大改进,在这种情况下,最好在方法体中使用Try-catch块(如果需要,允许从catch块返回值)