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

标签 c++ templates visual-c++ g++

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

相关文章:

c++ - 为什么需要在 VS 中为 packaged_task 复制构造函数

windows - 通用 Windows 平台应用程序和 C++/CLI (VS 2015 RC1)

visual-studio - "stdafx.h"在 Visual Studio 中有何用途?

c++ - 如果无法编译未使用的函数,则模板类使用 C++17 编译,但不使用 C++20

templates - 如何查看速度模板上可用的所有变量

templates - Azure 数据工厂 V2 : auto-start trigger upon deployment?

multithreading - 单/多线程 (OpenMP) 模式下计算精度的差异

c++ - 代码不编译 - 链表,按升序排序列表

c++ - 矩阵乘法在 CUDA 上给出了错误的结果

c++ - 如何加速包含图形数据的文本文件的 io/解析