Почему компилятор требует указания типа?

Я реализовал шаблон класса, который отвечает за построение одного типа (следует шаблону построителя). Конструктор построителя используется для вывода двух типов.

Ниже приведен пример, демонстрирующий проблему (с использованием проводника компилятора). Я использовал 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>{...})

Я все-таки хотел бы знать, чем расстроен компилятор? Разве компилятор не может определить тип? С++ 17 поддерживает это, верно?


person Kory    schedule 18.08.2019    source источник
comment
Компилятор может вывести тип, когда фактически создается экземпляр шаблона. Здесь это не похоже на фактическое создание, а просто еще одно определение шаблона.   -  person Sam Varshavchik    schedule 19.08.2019
comment
Это работает в проводнике компилятора. Что вы подразумеваете под работой? Что он компилирует или не компилирует? Кроме того, почему вы используете старую версию Clang?   -  person Nicol Bolas    schedule 19.08.2019
comment
Я имел в виду, что для демонстрации ошибки можно использовать проводник компилятора. Я обновил пост, чтобы прояснить это.   -  person Kory    schedule 19.08.2019


Ответы (1)


Это ошибка 41450. Программа актуальна.

person Barry    schedule 18.08.2019