Вызов метода объекта в шаблоне

У меня есть следующий код:

template<class T>
class TemplateA  : public virtual std::list<T>
{
protected:
unsigned int iSize;
public:
unsigned int getSize();
};
/////////////
template<class T>
unsigned int TemplateA<T>::getSize()
{
return iSize;
}
/////////////
/////////////
/////////////
template<class T>
class TemplateB : public TemplateA<T>
{
public:
unsigned int calcSize();
};
/////////////
template<class C>
unsigned int TemplateB<C>::calcSize()
{
iSize = C.getSize;
return iSize;
}
/////////////
/////////////
/////////////
// Class C (seperate file) has to contain function getSize()
class CMyClass
{
public:
static const unsigned int getSize = 5;
};

Это означает, что внутри класса TemplateB я хочу вызвать метод getSize, который определил переданный класс.

Я получаю следующее сообщение об ошибке:

error C2275: 'C' : illegal use of this type as an expression
while compiling class template member function 'unsigned int TemplateB<C>::calcSize()'
1>          with
1>          [
1>              C=CMyClass
1>          ]

Я уверен, что эта функция работает под VS 2003 … Что не так с методом? Может быть, настройка компилятора? Я не знаю, где установить что 🙁

0

Решение

Ты должен сказать this->getSize или же C::getSize; это откладывает поиск до второй фазы, когда известны аргументы шаблона.

4

Другие решения

Привет, вы могли бы упростить свой код, пока исправляете, все, что вы, похоже, сделали, это используйте C, а не TemplateB, так что если вы делаете:

template<class C>
unsigned int TemplateB<C>::calcSize()
{
return  c::getSize; //based on getSize being static
}

Вы сохраните память дополнительной переменной, и она должна работать нормально 🙂

Приложение:
Вот фрагмент рабочего кода, использующий ваш код в качестве основы:

#include <iostream>
#include <list>

using namespace std;

template<class T>
class TemplateA  : public virtual std::list<T>
{
protected:
unsigned int iSize;
public:
unsigned int getSize();
};

template<class T>
unsigned int TemplateA<T>::getSize()
{
return iSize;
}

template<class T>
class TemplateB : public TemplateA<T>
{
public:
unsigned int calcSize();
};

template<class C>
unsigned int TemplateB<C>::calcSize()
{
return C::getSize;
}

// Class C (seperate file) has to contain function getSize()
class CMyClass
{
public:
static const unsigned int getSize = 5;
};
int main()
{
CMyClass classme;
TemplateB<CMyClass> test ;
cout <<"Calc size outputs: "<< test.calcSize() << endl;

return 0;
}

Извиняюсь за непроверенный ответ ранее.
Надеюсь, это поможет!

1

По вопросам рекламы [email protected]