iso c ++禁止声明泛型,没有类型

时间:2012-05-25 15:53:28

标签: c++ generics

我的母语是C#,所以当我开始使用C ++时,我想为C#中可用的库使用者创建get / set sugar语法。

所以我写了......

template<typename T>
class GetProperty
{
    private:
        T (*get)();
    public:
        GetProperty(T (*get)())
        {
            this->get = get;
        }
        operator T()
        {
            return get();
        }
        template<typename S, typename T>
        GetProperty<S> operator=(GetProperty<T> fool)
        {
            throw 0;
        }
 };

然后,为了使用它,我写了代码:

template<typename T>
class Vector
{
    private:
        struct LinkItem
        {
            public:
                T* Item;
                LinkItem* Next;
                                GetProperty<int> Length (&getLength);
                LinkItem(T* Item = NULL, int length = 1, LinkItem* Next = NULL)
                {
                    this->Item = Item;
                    this->length = length;
                    this->Next = Next;
                }
                LinkItem& operator =(LinkItem rhs)
                {
                    this->Item = rhs.Item;
                    this->length = rhs.length;
                    this->Next = rhs.Next;
                    return *this;
                }
            private:
                 int length;
                 int getLength()
                 {
                     return length;
                 }
        };
        LinkItem* current;
    .
    .
    .
};

然而,Netbeans上的C / C ++添加(我相信这是g ++编译器)声称我实例化没有类型的GetProperty。
根据Google搜索,如果有人忘记使用声明,或者包含标题等,就会发生这种情况 但是int是原始的,所以这不可能 这是怎么回事?

2 个答案:

答案 0 :(得分:1)

您正在构造GetProperty对象,同时在结构中声明它。这在C ++中是不允许的。您必须将构造移动到构造函数。

答案 1 :(得分:0)

除了VC ++不实现非静态数据成员初始值设定项之外,您不能将成员函数getLength视为int (*)()。它的类型是int (LinkItem::*)()

struct Foo {
    int foo(void) {return 1;}
};

int main() {
    int (*var)() = &Foo::foo; // Error
    int (Foo::*var)() = &Foo::foo; // Okay
}

您可能不应该尝试导入这样的外国习语,但如果您真的想要,可以尝试以下内容。 (虽然正如Nicol Bolas指出的那样,你也可能不应该实现自己的链表,或者将它命名为'vector'。如果你正在学习C ++,那么在开始尝试重新发明之前,只需学习C ++方法。)

#include <functional>

template<typename T>
class GetProperty
{
private:
    std::function<int()> get;
public:
    GetProperty(std::function<int()> get)
        : get(get)
    {}
    operator T()
    {
        return get();
    }
};

template<typename T>
class Vector
{
private:
    struct LinkItem
    {
    public:
        T* Item;
        LinkItem* Next;
        GetProperty<int> Length;
        LinkItem(T* Item = NULL, int length = 1, LinkItem* Next = NULL)
            : Length([this] { return this->getLength(); })
        {
...