gpt4 book ai didi

c++ - 为什么在模板方法中的 clang 中检测到不完整的类型?

转载 作者:太空狗 更新时间:2023-10-29 20:02:41 30 4
gpt4 key购买 nike

今天在clang中遇到了一个让我很意外的编译问题。我想是合理的,但我喜欢更深入地挖掘并听到更多细节。如果可能的话,还有一些标准引用。

我有一个带有模板方法的类,它依赖于一个成员,该成员的类型在 header 中未定义(但在源代码中没有)。类似于以下内容:

// Menu.h
class Page;

class Menu
{
public:
.... // stuff

template<class Visitor>
void VisitWidget( Visitor&& visitor);

private:
std::unique_ptr<Page> m_page; // destructor implemented in source file, so Page is an incomplete type
};

template<class Visitor>
inline void Menu::VisitWidget( Visitor&& visitor);
{
m_page->Visit( std::forward<Visitor>(visitor) );
}

在 VisualStudio 中,它会编译。我希望这只会在实例化时提示;所以内联。但是,在 clang 中,一旦有人包含标题,它就不会编译。强制我在 Menu.h 中包含 Page.h(我想不惜一切代价避免)。

喜欢:

// Another.cpp (not Menu.cpp)
#include "Menu.h" // this trigger and error due Page is an incomplete type

即使整个 Another.cpp 没有使用 VisitWidget(即使在其他 header 中)

我猜这是由内联引起的,因为编译器没有义务真正使用它,但由于中间有模板我不太确定。 clang 真的在检查类型吗?

最佳答案

是的,它在 MSVC 中编译,因为它有一个众所周知的错误。它没有实现两步模板实例化。

详细说明。 MSVC 错误地推迟了模板解析,直到它在代码中实际实例化。它可能发生在完整的 Page 定义变得可见之后。

但是,标准要求模板在定义时预先解析,并且解析所有不依赖于模板参数的类型。这失败了,因为 m_page 不依赖于访问者参数 - 并且此时它仍然是不完整的类型。

P.S. 我什至无法表达我在 MSFT 对这种公然违反标准(以及其他行为)的愤怒。当必须将符合 MS 标准的代码移植到符合标准的编译器时,它使跨平台开发成为真正的痛苦。

关于c++ - 为什么在模板方法中的 clang 中检测到不完整的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37599877/

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