2015-05-21 3 views
0

Я пытаюсь вызвать этот конструктор класса:Аргумент шаблона для параметра типа шаблона должен быть типом?

template<typename T> 
ListNode<T>::ListNode(SkipListKind kind, const T& key){ 
    key = SkipListKey<T>(kind, key); // A private member of the class 
} 

Я называю это так:

std::shared_ptr<ListNode<T>(SkipListKind::NegInf, T{})>); 

Я получаю эту ошибку: аргумента шаблона для параметра типа шаблона должен быть типа

Может кто-нибудь объяснить, почему? Благодаря!

+1

И Бог написал это послание в ваших зерновых утром, вы не читали? _Чтобы сохранить баланс углового кронштейна ('<>'), как и для всех других типов кронштейнов! _ –

ответ

4

Все, что входит в внешний набор угловых скобок, является аргументом шаблона. std::shared_ptr принимает тип в качестве параметра шаблона. То, что у вас внутри внешнего набора угловых скобок, не является типом; это тип, за которым следуют аргументы конструктора.

Вы, вероятно, хотите:

std::make_shared<ListNode<T>>(SkipListKind::NegInf, T{}) 

Шаблон функции std::make_shared принимает тип в качестве параметра шаблона, а затем передает его аргументы в конструктор типа-, в конце концов возвращает std::shared_ptr на вновь созданный объект.

+0

Большое спасибо! Я не знал этого. – Rimoun

3

Это неправильно:

std::shared_ptr<ListNode<T>(SkipListKind::NegInf, T{})>); 
               // ^

вероятно Вы имели в виду, чтобы сделать это:

std::make_shared<ListNode<T>>(SkipListKind::NegInf, T{}); 
         //^