2015-08-10 6 views
2

Я пытался понять работу коды для повышения :: любых и пытался писать следующий кодинстанцирования шаблонного класса от шаблонных функций члена не шаблонного класса

class placeholder 
{ 
public: 
    virtual ~placeholder() {} 
    virtual placeholder* clone() const=0; 
}; 
//And this is the wrapper class template: 

template<typename ValueType> 
class holder : public placeholder 
{ 
public: 
    holder(ValueType const & value) : held(value) {} 
    virtual placeholder* clone() const 
    {return new holder(held);} 

private: 
    ValueType held; 
}; 

//The actual type erasing class any is a handle class that holds a pointer to the abstract base class: 

class any 
{ 
    public: 

    any() : content(NULL) {} 

    template<typename ValueType> 
     any(const ValueType & value): content(new holder(value)) {} 


    ~any() 
    {delete content;} 

    // Implement swap as swapping placeholder pointers, assignment 
    // as copy and swap. 

    private: 
    placeholder* content; 
}; 

int main(int argc, char ** argv) { 

    return 0; 
} 

Когда я пытаюсь компиляции кода я получаю следующую ошибку:

test.cxx: In constructor 'any::any(const ValueType&)': 
test.cxx:33: error: expected type-specifier before 'holder' 
test.cxx:33: error: expected ')' before 'holder' 

ошибка выше появляется в строке

any(const ValueType & value): content(new holder(value)) {} 

Я не совсем понимаю, почему тип здесь не может быть выведен. Я прочитал Why can I not call templated method of templated class from a templated function, но не смог решить вашу проблему.

Может кто-то помочь.

ответ

2

С holder является шаблоном, а C++ - not deduce template parameters based on the constructor, вы должны указать параметр шаблона при создании экземпляра в конструкторе any.

template <typename ValueType> 
any(const ValueType & value): content(new holder<ValueType>(value)) {} 
+0

Удивительный. Благодаря! – deb

Смежные вопросы