2015-10-05 3 views
0

Возможно ли получить доступ к функциям аргумента шаблона шаблона вне шаблона? Я попытался следующий без успеха:Параметры шаблона доступа (класса) за пределами шаблона

class A { 
public: 
    void func() { std::cout << ("A called"); } 
}; 

template<class T> 
class tClass { 
public: 
    T* operator->() { 
     return mem; 
    } 

    T* operator*() { 
     return mem; 
    } 

    const T* operator->() const { 
     return mem; 
    } 

    const T* operator*() const { 
     return mem; 
    } 

private: 
    T* mem; 
}; 

и главный:

tClass<A>* t = new tClass<A>(); 
t->func(); 

Я получаю следующее сообщение об ошибке компилятора: error: 'class tClass<A>' has no member named 'func' ли не переопределяют оператор -> возвращает указатель на аргумент шаблона? Я спрашиваю, потому что я видел очень похожий код, который работал. Я также видел другие ответы, предлагающие использовать typedef, но я не уверен, как это применимо здесь.

Игнорируйте тот факт, что объект mem не инициализирован.

Заранее благодарен!

+3

Вы, вероятно, имели в виду '(* t) -> func();' –

+0

Кроме того, интерфейс интеллектуальных указателей [operator->] (http://www.cplusplus.com/reference/memory/shared_ptr/operator- > /) должен возвращать указатель, в то время как [operator *] (http://www.cplusplus.com/reference/memory/shared_ptr/operator-%3E/) должен возвращать ссылку. Но, конечно, вы можете реализовать их, как хотите, просто указав. – aslg

ответ

5

Это:

tClass<A>* t = new tClass<A>(); 
t->func(); 

не называет tClass<A>::operator->, это разыменования сам tClass<A>*. И tClass<A> не имеет функции-члена func(), поэтому ошибка. Вам придется либо двойной разыменованием:

(*t)->func(); 

Или использовать не указатель на tClass<A>:

tClass<A> t; 
t->func(); 

Side-нота, это фразировка:

return a pointer to the template argument

ISN» t правильно. Аргумент шаблона - тип. В этом случае A. Вы возвращаете указатель на то, что имеет этот тип, а не сам тип.

+0

Да, я должен был указать указатель на объект типа T_. – zbarni

0

Вам также необходимо инициализировать ваш указатель T * mem !, например.

template<class T> 
class tClass { 
public: 
    explicit tClass(T *p):mem(p){} 

    T* operator->() { 
     return mem; 
    } 

    T* operator*() { 
     return mem; 
    } 

    const T* operator->() const { 
     return mem; 
    } 

    const T* operator*() const { 
     return mem; 
    } 

private: 
    T* mem; 
}; 

, а затем

tClass<A> t(new A()); 

, а затем идти дальше.

+0

'Игнорируйте тот факт, что объект mem теперь не инициализирован.« Я думаю, что op знает об этом. – aslg

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