C++ 调用对象';模板中的s方法

C++ 调用对象';模板中的s方法,c++,visual-studio-2010,templates,visual-studio-2003,C++,Visual Studio 2010,Templates,Visual Studio 2003,我有以下代码: 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() { re

我有以下代码:

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;
};
模板
类TemplateA:公共虚拟std::list
{
受保护的:
无符号整数码;
公众:
unsigned int getSize();
};
/////////////
模板
unsigned int TemplateA::getSize()
{
返回iSize;
}
/////////////
/////////////
/////////////
模板
类模板B:公共模板A
{
公众:
无符号int-calcSize();
};
/////////////
模板
unsigned int TemplateB::calcSize()
{
iSize=C.getSize;
返回iSize;
}
/////////////
/////////////
/////////////
//类C(单独的文件)必须包含函数getSize()
类CMyClass
{
公众:
静态常量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>          ]
错误C2275:'C':非法使用此类型作为表达式
编译类模板成员函数“unsigned int TemplateB::calcSize()”时
1> 与
1>          [
1> C=CMyClass
1>          ]

我敢肯定这个函数在VS2003下运行。。。这个方法有什么问题?也许是编译器设置?我不知道在哪里设置什么:(

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

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

嗨你可以简化你的工作r代码在更正时,您似乎只使用了C而不是TemplateB,因此如果您这样做:

template<class C>
unsigned int TemplateB<C>::calcSize()
{
    return  c::getSize; //based on getSize being static
}
模板
unsigned int TemplateB::calcSize()
{
返回c::getSize;//基于getSize是静态的
}
您将保存一个额外变量的内存,它应该可以正常工作:)

附录: 以下是以您的代码为基础的工作代码片段:

#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;
}
#包括
#包括
使用名称空间std;
模板
类TemplateA:公共虚拟std::list
{
受保护的:
无符号整数码;
公众:
unsigned int getSize();
};
模板
unsigned int TemplateA::getSize()
{
返回iSize;
}
模板
类模板B:公共模板A
{
公众:
无符号int-calcSize();
};
模板
unsigned int TemplateB::calcSize()
{
返回C::getSize;
}
//类C(单独的文件)必须包含函数getSize()
类CMyClass
{
公众:
静态常量unsigned int getSize=5;
};
int main()
{
CMyClass classme;
模板试验;

cout您好,您也可以在更正代码的同时简化代码,您似乎所做的只是使用C而不是TemplateB,因此如果您这样做:

template<class C>
unsigned int TemplateB<C>::calcSize()
{
    return  c::getSize; //based on getSize being static
}
模板
unsigned int TemplateB::calcSize()
{
返回c::getSize;//基于getSize是静态的
}
您将保存一个额外变量的内存,它应该可以正常工作:)

附录: 以下是以您的代码为基础的工作代码片段:

#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;
}
#包括
#包括
使用名称空间std;
模板
类TemplateA:公共虚拟std::list
{
受保护的:
无符号整数码;
公众:
unsigned int getSize();
};
模板
unsigned int TemplateA::getSize()
{
返回iSize;
}
模板
类模板B:公共模板A
{
公众:
无符号int-calcSize();
};
模板
unsigned int TemplateB::calcSize()
{
返回C::getSize;
}
//类C(单独的文件)必须包含函数getSize()
类CMyClass
{
公众:
静态常量unsigned int getSize=5;
};
int main()
{
CMyClass classme;
模板试验;

这个代码是错误的。这里的语言是C++,不是C++或java。这个代码是错误的。这里的语言是C++,不是C语言或java语言。非虚拟析构函数。另一方面,由于标准容器(有意)使用非虚拟析构函数,因此不鼓励从标准容器继承。