我怎样才能使用g ++模仿MSVC++的模板实例化行为?

Jui*_*box 5 c++ templates g++ visual-c++

我正在尝试将我自己的lib从Visual Studio移植到GNU/Linux上的g ++,我在模板编译时遇到了一些问题.实际上,在Visual C++中,模板只有在代码中明确使用时才会生成,而看起来(根据我的错误)g ++在首次使用之前会评估模板的内容.这会导致以下错误:

error: incomplete type ‘X’ used in nested name specifier
Run Code Online (Sandbox Code Playgroud)

...因为我在模板代码之后包含了一些类,而不是之前.我这样做是因为交叉使用冲突.

总而言之,Visual C++似乎不会尝试在使用时解析模板的内容,而g ++会尽快解析.

class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{ 
   a_pArg->foo();
};
Run Code Online (Sandbox Code Playgroud)

(_Ty没有使用,但没关系,只是解释问题)

在那种情况下,Visual C++将编译(即使MyClass不是预先声明的),而g ++不会,因为MyClass尚未完全声明.

有没有办法告诉g ++只在使用时实例化模板?

Xeo*_*Xeo 9

不,这就是两阶段查找的工作方式.MSVC实现它错误,它几乎跳过了第一阶段,它在定义点解析模板.MSVC仅在此处执行一些基本语法检查.在第二阶段,在实际使用模板时,只应检查从属名称.MSVC在这里进行所有类型的解析.GCC正确实现了两阶段查找.

在您的情况下,因为MyClass它不是模板参数,所以它可以在第一阶段检查它.您只需要在此之前包含类标题.