Что я сделал не так с этим простым шаблоном класса? - PullRequest
1 голос
/ 15 ноября 2010

Я написал небольшой класс для помощи в преобразованиях в и из неуклюжих типов MSVC:

template <class FromType>
struct convert
{
    convert(FromType const &from)
        :   from_(from) {}
    operator LARGE_INTEGER() {
        LARGE_INTEGER li;
        li.QuadPart = from_;
        return li;
    }
private:
    FromType const &from_;
};

Позже я делаю это:

convert(0)

И получаю это сообщение об ошибке отMSVC:

1> e: \ src \ cpfs \ libcpfs \ device.cc (41): ошибка C2955: 'convert': использование шаблона класса требует списка аргументов шаблона

1> e: \ src \ cpfs \ libcpfs \ device.cc (17): см. Объявление 'convert'

Я думал, что FromType может быть выведено из целого числа, которое я передаю?Что происходит?

1 Ответ

4 голосов
/ 15 ноября 2010

Шаблоны классов никогда не создаются неявно. Учитывая определение класса, которое вы дали, вы должны сказать:

convert<int>(0)

... чтобы вызвать конструктор этого класса.

С аргументами шаблона по умолчанию вы можете улучшить (?) Его до:

template <class FromType = int>
struct convert
{ /* ... */ };

, а затем вызвать его как:

convert<>(0)

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

template <typename FromType>
convert<FromType> make_convert(FromType from) {
   return convert<FromType>(from);
}

Это более или менее подход, используемый, например, в std :: make_pair ().

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