Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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/9/visual-studio/8.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
Visual C+中的函数try块+;2008 > >编辑2 :如果我将方法定义移入类定义之外,VisualC++ 2008就正确编译了。< /P>_C++_Visual Studio - Fatal编程技术网

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块返回值)


如果它在其他编译器中编译,包括同一编译器的更新版本,然后,您使用的编译器中似乎有一个bug,这显然是一个编译器bug。如果可以找到一些错误报告,请查看microsoft connect。无论如何,一个切实可行的解决方案是升级编译器。@Cheersandhth.-Alf我正在尝试编写一个甚至可以与旧编译器一起使用的库。正确的解决方案可能是添加额外的大括号…如果您将函数定义移出类定义,该怎么办?@molbdnilo如果我将定义移出,它会起作用。我将编辑我的问题。标准(§A.7)中包含的语法要求函数try块也可以用于函数和常规方法。但是,答案中的链接指定VisualStudio2008为构造函数实现它(可能只有构造函数?)。我猜VisualStudio2008不符合标准,微软用VisualStudio2010解决了这个问题。。。