Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > шаблоны


Автор: zss 6.5.2006, 22:21
есть шаблонный конструктор
Код

struct S{
    int s1;
    int s2;
   
    template <class T> S(const T& obj){
        ...
    }
}


почему компилятор не требует задания шаблонного аргумента
Код

struct D;

D d;
S* s = new S(d);


а вроде должно так
Код

struct D;

D d;
S<D>* s = new S(d);


Тоесть не понятно - иногда для шаблонов это обязательно, а иногда нет smile
 

Автор: maxim1000 6.5.2006, 22:28
если я не ошибаюсь, компилятор пытается "угадать" параметры шаблона на основании имеющейся информации
в данном примере он смотрит на то, что параметр константной ссылки должен соответствовать параметру шаблона, вот и делает T=D
такое угадывание не всегда корректно, но никто не заставляет ним пользоваться - в более сложных случаях можно указывать параметры шаблона везде - так будет надёжнее... 

Автор: DeadSoul 6.5.2006, 22:31
Цитата(maxim1000 @  6.5.2006,  22:28 Найти цитируемый пост)
если я не ошибаюсь, компилятор пытается "угадать" параметры шаблона на основании имеющейся информации


maxim1000, Вы нисколько не ошибаетесь 

Автор: zss 6.5.2006, 23:09
Цитата(maxim1000 @  6.5.2006,  22:28 Найти цитируемый пост)
в более сложных случаях можно указывать параметры шаблона везде - так будет надёжнее...  

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

Выскакивают его непонятные притензии smile 

Автор: Void 6.5.2006, 23:43
Цитата(zss @  7.5.2006,  01:09 Найти цитируемый пост)
меня смутило, что явное задание шаблонного аргумента 

Меня тоже слегка озадачило. Выяснилось, что:
Цитата
because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates.

Стандарт, 14.5.2/5. 

Автор: MAKCim 7.5.2006, 08:42
Цитата

S<D>* s = new S(d);

S у вас не шаблон, потому и выскакивают непонятные претензии  smile

Добавлено @ 08:47 
Цитата

Тоесть не понятно - иногда для шаблонов это обязательно, а иногда нет 

Как раз понятно: когда компилятор не может вывести тип - требуется явная параметризация (подробнее Вандевурд, Джосаттис)
Код

template<class T> struct traits
    {typedef const T& type;};

template<class T> void F(const T& obj) {}
template<class T> void G(typename traits<T>::type obj) {}

int main()
{
    F(12); // OK
    G(12); // Error
    G<int>(12); // OK
}
 

Автор: zss 7.5.2006, 09:24
Цитата(MAKCim @  7.5.2006,  08:42 Найти цитируемый пост)
S у вас не шаблон

наверное ты прав smile Но для конструктора тоже не задается шаблонный аргумент 

Автор: MAKCim 7.5.2006, 17:18
Цитата

тоже не задается шаблонный аргумент  

он выводится 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)