在一个项目中,在一个文件中," CalibHessian"已定义:
struct CalibHessian
{
EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
static int instanceCounter;
VecC value_zero;
VecC value_scaled;
VecCf value_scaledf;
VecCf value_scaledi;
VecC value;
VecC step;
VecC step_backup;
VecC value_backup;
VecC value_minus_value_zero;
inline ~CalibHessian() {instanceCounter--;}
inline CalibHessian()
{
VecC initial_value = VecC::Zero();
initial_value[0] = fxG[0];
initial_value[1] = fyG[0];
initial_value[2] = cxG[0];
initial_value[3] = cyG[0];
setValueScaled(initial_value);
value_zero = value;
value_minus_value_zero.setZero();
instanceCounter++;
for(int i=0;i<256;i++)
Binv[i] = B[i] = i; // set gamma function to identity
};
// normal mode: use the optimized parameters everywhere!
inline float& fxl() {return value_scaledf[0];}
inline float& fyl() {return value_scaledf[1];}
inline float& cxl() {return value_scaledf[2];}
inline float& cyl() {return value_scaledf[3];}
inline float& fxli() {return value_scaledi[0];}
inline float& fyli() {return value_scaledi[1];}
inline float& cxli() {return value_scaledi[2];}
inline float& cyli() {return value_scaledi[3];}
};
但在另一个名为&#34; CoarseInitializer.h&#34;的文件中,它显示为:
namespace dso
{
struct CalibHessian;
struct FrameHessian;
...
}
这对班级并没有什么新鲜事,而CalibHessian&#34;但只是重新宣布了它。它没有包含相应的标题。但是在文件&#34; CoarseInitializer.cpp&#34;现在它包括&#34; CalibHessian.h的标题&#34;。
我想知道这是重新宣布的必要吗?它用于什么?
答案 0 :(得分:0)
第一个文件是CalibHessian
的定义。头文件(CoarseInitializer.h)声明为CalibHessian
。
定义是确定名称行为方式的代码。声明只是名称存在的声明。您将声明放在头文件中,因为这就是告诉文件有关其他文件中是否存在名称的方法。
答案 1 :(得分:0)
前向声明是为了编译器。这似乎不是必要的,但是首选。
所以这个问题的答案不是必要的,而是为了取得成功。
感谢@Some程序员老兄的提示!