强制模板参数为结构

时间:2010-01-18 14:10:37

标签: c++ templates

我正在尝试创建一个基本模板类,其参数 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);
        }
}

4 个答案:

答案 0 :(得分:1)

标题中的问题可以被驳回;除了源代码检查之外,不能区分C ++类和结构。

解释非常混乱。显然有关于struct x的消息,但示例代码不包含单个x。这告诉我,你不小心匹配错误和源代码。一旦你这样做,你就不再需要StackOverflow了 - 你会自己看到问题。

答案 1 :(得分:1)

除了在类/结构定义之后缺少两个分号之外,您发布的代码没有任何问题:http://codepad.org/yfbHa8sO

答案 2 :(得分:1)

编译器抱怨使用“不完整”类型的大多数(如果不是全部)次,问题在于尝试使用尚未完全定义的前向声明的类。

你可以用不完整的类型做很多事情:定义获取或返回类型的函数或对它的引用,定义该类型的引用或指针变量......以及其他你不能做的:定义变量该类型,创建该类型的对象,调用任何方法或从类型请求任何属性...

答案 3 :(得分:0)

问题与T必须是结构的事实无关。问题在于,其中一个结构(我在我的代码中使用但不是由我创建的)被gcc称为不完整。无论如何,我删除了使用此结构的类,其他类使用相同的基类进行编译。所以,由我来解决它,我对这个问题的假设是错误的。