вывод типа шаблона в функции-члене шаблонного класса - PullRequest
0 голосов
/ 26 апреля 2020

Сбой вывода в первой строке основной функции, как это решить без добавления дополнительных параметров шаблона

#include <iostream>

template <typename T>
class myVec{
    size_t _size{};
    size_t capacity{};
    T* data{};

public:
    myVec(size_t size = 0, T value = T{}):_size{size}, capacity{2 * _size}{
        data = new T[capacity];
        for(size_t index{}; index < _size; index++)
            data[ index ] = T{};
    }

    template <typename ... Ts>
    myVec( Ts&& ... vals):myVec{ sizeof...(vals)}{


        size_t index{};
        ((data [ ++index ] = vals),...);
    }

    ~myVec(){
        delete[] data;
    }
    size_t size( ){
        return _size;
    }
    /*the rest */

};

int main(){
    myVec vec {1, 32, 5, 6};

    for(size_t index{}; index < vec.size(); ++index )
        std::cout << vec[ index ] << " ";
}

1 Ответ

4 голосов
/ 26 апреля 2020

Шаблоны классов могут неявно выводить аргумент шаблона класса, только если он точно соответствует конструктору, например:

template <typename T>
class myVec
{
    ...
    myVec(int, T); // T can be deduced since it's from the class template
    ...
};
...
myVec(5,5); // deduces myVec<int>

С другой стороны, типы из шаблона конструктора не участвуют в выводе напрямую. - поскольку выведенные типы не обязательно должны быть того же типа, что и шаблон класса:

template <typename T>
class myVec
{
    ...
    template <typename U>
    myVec(int, U); // U may not be the same as T!
    ...
    template <typename...Ts>
    myVec(Ts&&...); // All 'Ts' types may not be the same as 'T'
    ...
};

Обойти это можно с помощью пользовательских руководств по выводам . Они позволяют вам определить, какой тип выводится при столкновении с неоднозначными выражениями конструктора. В вашем случае вы, вероятно, ищете что-то вроде:

template <typename...Ts> 
myVec(Ts...) -> myVec<std::common_type_t<Ts...>>;

Примечание: std::common_type_t используется для получения общего типа всех типов variadi c. Он определен в заголовке <type_traits>.

...