c ++ автоматический вывод шаблона завершается неудачно для аргумента шаблона - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы лучше понять, почему автоматический вывод шаблона (применяется при компиляции с g++ -std=c++17) работает в первых трех строках main(), но не работает в четвертой.Есть ли вероятность, что это будет принято компиляторами в ближайшем будущем?

template <typename P = void>
class A {
public:
    void f1() {}
};

template<typename C>
void g() {}


int main() {
    A<> a;       // works
    A aa;        // works
    g<A<>>();    // works
    g<A>();      // fails
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

В C ++ 17 вывод аргумента шаблона также выполняется, когда имя шаблона класса используется в качестве типа создаваемого объекта.

Ничего не меняется для явного типа внутри шаблона.

0 голосов
/ 24 сентября 2018

Это просто вопрос подписи.В основном вы передаете неправильный тип.

И A a, и A<> a означают, что вам нужен экземпляр A со значением параметра шаблона по умолчанию, то есть вы получите A< void >.

Функция g< C >() принимает параметр шаблона, который является типом, а не другим шаблонным типом.Когда вы вызываете его с помощью A<>, вы сообщаете компилятору, что вы хотите использовать «экземпляр» шаблонного типа A, который действителен.Когда вы вызываете его с помощью A, вы сообщаете компилятору, что хотите вызвать g< C >(), причем C является шаблонным типом, который не соответствует его сигнатуре.

Если вы объявляете / определяете g() следующим образомtemplate <typename <typename> TTemplatedType> g() он будет принимать вызов таким образом g< A >(), но g< A<> >() потерпит неудачу, потому что теперь он больше не хочет чего-то другого, кроме шаблонного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...