我正在尝试将我自己的库从 Visual Studio 移植到 GNU/Linux 上的 g++,但我遇到了一些模板编译问题。事实上,在 Visual C++ 中,只有在代码中明确使用模板时才会生成模板,而 g++ 似乎(从我的错误来看)在模板首次使用之前评估模板的内容。这会导致以下错误:
error: incomplete type ‘X’ used in nested name specifier
... 因为我在模板代码之后而不是之前包含了一些类。由于交叉使用冲突,我这样做。
总而言之,Visual C++ 似乎不会尝试在使用时解析模板的内容,而 g++ 会尽快解析。
class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{
a_pArg->foo();
};
(_Ty没用不过没关系,只是为了说明问题)
在这种情况下,Visual C++ 会编译(即使未预先声明 MyClass
),而 g++ 不会,因为 MyClass
尚未完全声明。
有没有办法告诉 g++ 只在使用时实例化模板?
最佳答案
不,那是两阶段查找的工作方式。 MSVC 实现错误,它几乎跳过了第一阶段,即在定义点解析模板。 MSVC 在这里只做一些基本的语法检查。在第二阶段,在实际使用模板时,只应检查依赖名称。 MSVC 在这里进行各种解析。 GCC 正确实现了两阶段查找。
在您的情况下,由于 MyClass
不是模板参数,它可以在第一阶段检查它。您只需需要在此之前包含您的类标题。
关于c++ - 我怎样才能让 g++ 模仿 MSVC++ 的模板实例化行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418624/