Нужна помощь в отношении создания экземпляров класса Template - PullRequest
0 голосов
/ 14 августа 2011

Позвольте мне представить мою проблему на примере:

template <typename T> class a{
public:
    T data;
    a():data(T()){}
    a(T temp): data(temp) {}
};

Так что, если написать в main() как

a(30);
a("String");

Таким образом, согласно правилу вывода аргументов шаблона, он должен иметь возможность генерировать первый временный класс как a<int>(30) и т. Д.

.

Но я ошибаюсь, что говорит:

пропущены аргументы шаблона перед '(' токен

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

Ответы [ 5 ]

3 голосов
/ 14 августа 2011

Вывод параметра шаблона из аргументов работает только для функций , никогда для классов . Пока вы не знаете тип класса, то есть все его параметры шаблона, вы даже не знаете, какие функции-члены имеет класс!

Итак, вы всегда должны произносить параметры шаблона, если хотите построить объект напрямую:

a<int> x(30);

Вот небольшой мысленный эксперимент, который расширит вышесказанное. Предположим, у нас есть

template <typename T> class Foo;

и мы звоним Foo::somefunction(x);, где x - некоторый тип. Вы думаете, ну, я объявил somefunction() так:

template <typename T> class Foo
{
  static void somefunction(const T & x);
};

, поэтому должно быть очевидно, что T того же типа, что и тип x. Но теперь представьте, что у меня есть специализация:

template <> class Foo<char>
{
  static void anotherfunction(double x);
};

Класс Foo<char> даже не имеет функцию somefunction(), поэтому выражение Foo::somefunction(x) даже не доходит до той стадии, когда я мог бы найти аргумент!

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

template <typename T> a<T> make_a(const T & x) { return a<T>(x); }

Поскольку это шаблон function , его параметры могут быть выведены:

make_a(30);      // type a<int>
make_a("hello"); // type a<char[6]>
1 голос
/ 14 августа 2011

Конструктор является , а не шаблоном, его класс является шаблоном.Поэтому, когда вы пишете a(30), выведение аргумента шаблона для шаблона класса не может быть выполнено!

Если существует шаблон конструктора, то аргумент шаблона для конструктора-шаблона может быть выведенкомпилятором.Например, здесь:

template <typename T> class A{
public:
    template<typename U>
    A(const U &): {}   //note : it's a constructor template
};

A<char>  obj(30); //U is deduced as int

В вышеприведенном примере можно вывести только U, вам все равно нужно указать T.Это потому, что

  • U является аргументом шаблона для шаблона конструктора.В этом случае можно сделать вывод аргумента шаблона.
  • T является аргументом шаблона для шаблона класса.Вывод аргумента шаблона не может быть выполнен здесь.
0 голосов
/ 14 августа 2011

Вывод типа шаблона происходит только для функций шаблона.Вам необходимо указать параметры для создания экземпляра класса шаблона.Вы можете использовать шаблон функции, чтобы вывести параметр шаблона и вернуть соответствующий тип.В c ++ 0 x вы можете использовать auto для хранения экземпляра.Не могу легко написать пример кода для тебя на моем телефоне!

0 голосов
/ 14 августа 2011

Вы не можете вывести аргументы шаблона класса из аргументов в конструктор - к сожалению.

0 голосов
/ 14 августа 2011

Вам все еще нужно объявить временное значение, например, a<int>(30).

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