0

我有以下代码:

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 下可以工作......这个方法有什么问题?也许是编译器设置?我不知道在哪里设置什么:(

4

2 回答 2

4

你应该说this->getSizeC::getSize;当模板参数已知时,这会将查找推迟到第二阶段。

于 2013-11-04T09:05:22.487 回答
1

嗨,您也可以在更正的同时简化代码,您似乎所做的只是使用 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;
}

为之前未经检查的答案道歉。希望这个有帮助!

于 2013-11-04T09:09:46.810 回答