gpt4 book ai didi

c++ - 为什么编译器需要指定类型?

转载 作者:太空狗 更新时间:2023-10-29 20:08:00 25 4
gpt4 key购买 nike

我已经实现了一个类模板,它负责构造单一类型(遵循构建器模式)。构建器的构造函数用于推导两种类型。

下面是一个演示问题的示例(使用编译器资源管理器)。我将 clang 6 与 -std=c++17 结合使用。

#include <utility>

template <typename T>
struct builder
{
explicit builder(T& _t);
auto option(int x) -> builder&;
auto build() -> int;
};

template <typename T>
void build_it(T& _t, int _u)
{
// Why does the line below not compile?
// C++17 compilers should be able to deduce the type, right?
auto obj = builder{_t}.option(_u).build();
}

这是我收到的错误消息。


x86-64 clang 6.0.0 (Editor #1, Compiler #1) C++
x86-64 clang 6.0.0

-std=c++17 -O2 -Wall -Wextra
1
<Compilation failed>
x86-64 clang 6.0.0 - 455ms
#1 with x86-64 clang 6.0.0
<source>:15:27: error: member reference base type 'builder' is not a structure or union

auto obj = builder{_t}.option(_u).build();

~~~~~~~~~~~^~~~~~~~~

1 error generated.

Compiler returned: 1

我已经通过以下方式解决了这个问题:

  • 使用函数模板(例如 make_builder(...))
  • 为构建器命名(例如 builder b{...})
  • 指定模板参数(例如 builder<T>{...})

我还是想知道编译器为什么不高兴?编译器不能推断类型吗? C++17 支持这个,对吗?

最佳答案

这是 clang bug 41450 .程序有效。

关于c++ - 为什么编译器需要指定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57548813/

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