gpt4 book ai didi

c++ - 我怎样才能让 g++ 模仿 MSVC++ 的模板实例化行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:47 24 4
gpt4 key购买 nike

我正在尝试将我自己的库从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com