将一小段代码从 c++11 转换为 c++03?
Convert small bit of code from c++11 to c++03?
我是一名试图编译 C++ 代码的社会科学家,遇到了一些小问题,我认为如果你了解 C++ 就很容易解决,但对我来说却难以理解。
尝试在 V2008 上编译,但我的代码似乎使用了一些 C++11 语法技巧。
In principle, I think this is solution,但我真的不懂C++,所以不知道如何实现。
代码块:
Optimiser::Optimiser(double eps, double delta, unsigned long max_itr, long random_order)
{
this->eps = eps;
this->delta = delta;
this->max_itr = max_itr;
this->random_order = random_order;
}
Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000, 1)
{
//ctor
}
我得到的错误(参考 Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000,1) 行)是:
c:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python.0\VC\Include\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
src\Optimiser.cpp(39) : error C2039: '{ctor}' : is not a member of 'Optimiser' include\Optimiser.h(26) : see declaration of 'Optimiser'
src\Optimiser.cpp(40) : error C2614: 'Optimiser' : illegal member initialization: 'Optimiser' is not a base or member
error: command '"c:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python.0\VC\Bin\amd64\cl.exe"' failed with exit status 2
直到 C++11 才允许委派构造函数。也就是说,您将复制代码,但您可以简单地将第二个构造函数更改为
Optimiser::Optimiser()
{
eps = 1.0e-5;
delta = 1.0e-2;
max_itr = 1000UL;
random_order = 1L;
//rest of your ctor
}
我建议更改此设置:
Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000, 1)
{
//ctor
}
对此:
Optimizer::Optimizer()
: eps(1.0e-5), delta(1.0e-2), max_itr(1000), random_order(1)
{
}
可能最直接的解决方案是删除当前的默认构造函数并在另一个构造函数中提供默认参数
class Optimiser {
public:
Optimiser(double eps = 1e-5, double delta = 1e-2, unsigned long max_itr = 1000, long random_order = 1);
...
}
构造函数定义可以保持原样,但最好使用初始化列表
Optimiser::Optimiser(double p_eps, double p_delta, unsigned long p_max_itr, long p_random_order):
eps(p_eps),
delta(p_delta),
max_itr(p_max_itr),
random_order(p_random_order)
{
}
我是一名试图编译 C++ 代码的社会科学家,遇到了一些小问题,我认为如果你了解 C++ 就很容易解决,但对我来说却难以理解。
尝试在 V2008 上编译,但我的代码似乎使用了一些 C++11 语法技巧。
In principle, I think this is solution,但我真的不懂C++,所以不知道如何实现。
代码块:
Optimiser::Optimiser(double eps, double delta, unsigned long max_itr, long random_order)
{
this->eps = eps;
this->delta = delta;
this->max_itr = max_itr;
this->random_order = random_order;
}
Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000, 1)
{
//ctor
}
我得到的错误(参考 Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000,1) 行)是:
c:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python.0\VC\Include\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
src\Optimiser.cpp(39) : error C2039: '{ctor}' : is not a member of 'Optimiser' include\Optimiser.h(26) : see declaration of 'Optimiser'
src\Optimiser.cpp(40) : error C2614: 'Optimiser' : illegal member initialization: 'Optimiser' is not a base or member
error: command '"c:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python.0\VC\Bin\amd64\cl.exe"' failed with exit status 2
直到 C++11 才允许委派构造函数。也就是说,您将复制代码,但您可以简单地将第二个构造函数更改为
Optimiser::Optimiser()
{
eps = 1.0e-5;
delta = 1.0e-2;
max_itr = 1000UL;
random_order = 1L;
//rest of your ctor
}
我建议更改此设置:
Optimiser::Optimiser() : Optimiser::Optimiser(1e-5, 1e-2, 1000, 1)
{
//ctor
}
对此:
Optimizer::Optimizer()
: eps(1.0e-5), delta(1.0e-2), max_itr(1000), random_order(1)
{
}
可能最直接的解决方案是删除当前的默认构造函数并在另一个构造函数中提供默认参数
class Optimiser {
public:
Optimiser(double eps = 1e-5, double delta = 1e-2, unsigned long max_itr = 1000, long random_order = 1);
...
}
构造函数定义可以保持原样,但最好使用初始化列表
Optimiser::Optimiser(double p_eps, double p_delta, unsigned long p_max_itr, long p_random_order):
eps(p_eps),
delta(p_delta),
max_itr(p_max_itr),
random_order(p_random_order)
{
}