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语言。非虚拟析构函数。另一方面,由于标准容器(有意)使用非虚拟析构函数,因此不鼓励从标准容器继承。