Как заставить компилятор выводить аргумент шаблона класса? - PullRequest
0 голосов
/ 22 апреля 2019

Я новичок в шаблонах c ++ и (совершенно безуспешно) пытаюсь заставить компилятор выводить аргумент typename шаблона при инициализации.

Вот мой код.

template <typename T>
class C
{
public:
        T a;
        C(T a) : a(a) {}
        C(const C<T>& other) : a(other.a) {}
};

int main()
{
        C<int> x(1);
        C y{ x };

        return 0;
}

Этот код, скомпилированный g ++, приводит к ошибке.

test.cpp:13:11: error: missing template arguments before ‘y’
         C y{ x };
           ^

Я бы хотел сохранить этот синтаксис - просто C без явного указания аргумента шаблона.

Я пытался использовать направляющие вычеты, но возникла только другая ошибка.

template <typename T> C(const C<T>& other) -> C<T>;

Когда я вставил эту строку ниже определения класса C, я получил это.

test.cpp:10:51: error: expected constructor, destructor, or type conversion before ‘;’ token
 template <typename T> C(const C<T>& other) -> C<T>;
                                                   ^

Другая ошибка произошла, когда я поместил эту строку в определение класса C (вверху).

C(const C<T>& other) -> C<T>;
test.cpp:4:26: error: ‘C’ function with trailing return type not declared with ‘auto’ type specifier
  C(const C<T>& other) -> C<T>;
                          ^~~~

В обоих случаях первое упоминание об ошибке по-прежнему присутствует.

Спасибо!

1 Ответ

1 голос
/ 22 апреля 2019

В C ++ 11 только шаблонные функции могут получать свои параметры шаблона.Например, если:

void f(std::pair<int, char> &s);

, его можно вызвать с помощью

f(std::make_pair(5, 'c'));

, поскольку std::make_pair является функцией и аргументы шаблона могут быть выведены для функций.

Однако нельзя вызывать его с парой:

f(std::pair(5, 'c'));

, поскольку для шаблонов классов не вычитается аргумент шаблона.Эта проблема была исправлена ​​в C ++ 17, из-за чего std::make_pair немного устарел.

Подробнее о выводе аргументов шаблона нового класса можно узнать здесь .

Чтобы решить вашу проблему, я смог получить ту же ошибку при компиляции с gcc с использованием C ++ 11.Код компилируется без ошибок с C ++ 17 (для gcc это можно сделать, передав аргумент -std=c++17).

...