我正在尝试创建一个基本模板类,其参数 T 必须是一个结构。
当我使用声明为 T 类型的变量时(模板类中的变量都在扩展定义 T 的类中),GCC无法编译它:
GCC错误:无效使用不完整 输入'struct x'
尽管它在VC上工作,但我知道它不起作用,因为它不应该因为编译器不知道 T 所代表的类型的标准。
有没有办法明确表示类型必须是结构?
我在VC中使用的代码中所做的是:
在基类中:
T* x
new T
sizeof(T)
在那些扩展它的人:
x->member
编辑:我试图采用相关代码。这是:
struct SomeStructureType
{
int memberA;
int memberB;
}
template <typename T> class Base
{
protected:
T* s;
void addMember(string name,void* offset);
Base()
{
s = new T;
}
};
class Extender : public Base<SomeStructureType>
{
public:
Extender()
{
addMember("memberA",&s->memberA);
}
}
答案 0 :(得分:1)
标题中的问题可以被驳回;除了源代码检查之外,不能区分C ++类和结构。
解释非常混乱。显然有关于struct x
的消息,但示例代码不包含单个x
。这告诉我,你不小心匹配错误和源代码。一旦你这样做,你就不再需要StackOverflow了 - 你会自己看到问题。
答案 1 :(得分:1)
除了在类/结构定义之后缺少两个分号之外,您发布的代码没有任何问题:http://codepad.org/yfbHa8sO
答案 2 :(得分:1)
编译器抱怨使用“不完整”类型的大多数(如果不是全部)次,问题在于尝试使用尚未完全定义的前向声明的类。
你可以用不完整的类型做很多事情:定义获取或返回类型的函数或对它的引用,定义该类型的引用或指针变量......以及其他你不能做的:定义变量该类型,创建该类型的对象,调用任何方法或从类型请求任何属性...
答案 3 :(得分:0)
问题与T必须是结构的事实无关。问题在于,其中一个结构(我在我的代码中使用但不是由我创建的)被gcc称为不完整。无论如何,我删除了使用此结构的类,其他类使用相同的基类进行编译。所以,由我来解决它,我对这个问题的假设是错误的。