如何使用 "using XXX" 正确转发声明结构?

How to correctly forward declare struct with "using XXX"?

有一个 header 文件 "api.h" 我必须使用,我可以 NOT 修改它,但是其中所有结构的名称太长,可读性差,命名风格也和我的项目不一样。

例如在文件 "api.h":

#pragma once
struct AVERYVERYLONGLONGNAMEOFSTRUCT1 {
   ...
};
struct AVERYVERYLONGLONGNAMEOFSTRUCT2 {
   ...
};
...

所以,我创建了另一个header"common.h",以便re-name他们。

文件"common.hpp":

#pragma once
#include "api.h"
namespace MyProject {
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;
using AccountDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT2;
};

但我只想将它包含在实现文件 ( *.cpp ) 中,而不是其他 header 文件中,因为我想加快编译过程。 假设我在"myclass.hpp"中声明了一个class,并在"myclass.cpp"中实现了它。 我尝试将结构 ContraDef_t 的前向声明添加到 "myclass.hpp" 中,如下所示:

#pragma once
namespace MyProject {
struct ContraDef_t;
class MyClass_t {
   MyClass_t( const ContraDef_t * );
   ...
};
};

然后在 "myclass.cpp":

#include "common.hpp"
#include "myclass.hpp"
namespace MyProject {
MyClass_t::MyClass_t( const ContraDef_t * pcd ) {
   ...
};
};

最后,我可以 NOT 通过 "error: using typedef-name ‘using ContraDef_t = struct AVERYVERYLONGLONGNAMEOFSTRUCT1’ after ‘struct’..."

的编译

我该怎么办?任何帮助或提示将不胜感激!

仅在 header 中放置前向声明并包含 header:

// common.h
// dont include api.h here !
struct AVERYVERYLONGLONGNAMEOFSTRUCT1;
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;

// my_class.h
#include "common.h"
struct my_class{ 
    ContraDef_t* c;
};

// my_class.cpp
#include "my_class.h"
#include "api.h"
// ...