iso c&x2B+;禁止声明没有类型的泛型 我的母语是C,所以当我开始使用C++时,我想为C语言中的库用户创建GET/SET糖语法。

iso c&x2B+;禁止声明没有类型的泛型 我的母语是C,所以当我开始使用C++时,我想为C语言中的库用户创建GET/SET糖语法。,c++,generics,C++,Generics,所以我写了 template<typename T> class GetProperty { private: T (*get)(); public: GetProperty(T (*get)()) { this->get = get; } operator T() { return get(); }

所以我写了

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;
        }
 };
模板
类GetProperty
{
私人:
T(*get)();
公众:
GetProperty(T(*get)()
{
这个->获取=获取;
}
算子T()
{
返回get();
}
模板
GetProperty运算符=(GetProperty)
{
掷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;
    .
    .
    .
};
模板
类向量
{
私人:
结构链接项
{
公众:
T*项目;
链接项*下一步;
GetProperty长度(&getLength);
LinkItem(T*Item=NULL,int-length=1,LinkItem*Next=NULL)
{
此->项目=项目;
这个->长度=长度;
这个->下一个=下一个;
}
链接项和运算符=(链接项rhs)
{
此->项目=右侧项目;
此->长度=rhs.length;
此->下一步=右下一步;
归还*这个;
}
私人:
整数长度;
int getLength()
{
返回长度;
}
};
链接项*当前;
.
.
.
};
然而,Netbeans上的C/C++添加(我相信这是g++编译器)声称我正在实例化没有类型的GetProperty。
根据谷歌搜索,如果有人忘记了using语句或包含标题等,就会发生这种情况。
但是int是一个基元,所以这不可能是基元。

发生什么事了

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

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

您可能不应该尝试导入这样的外国习语,但是如果您真的想导入,您可以尝试以下方法。(正如Nicol Bolas指出的,你也不应该执行你自己的链表,或者命名它为‘向量’。如果你在学习C++之前,先学习C++方法,然后再尝试重新发明。”
#包括
模板
类GetProperty
{
私人:
std::函数get;
公众:
GetProperty(std::函数get)
:get(get)
{}
算子T()
{
返回get();
}
};
模板
类向量
{
私人:
结构链接项
{
公众:
T*项目;
链接项*下一步;
获取属性长度;
LinkItem(T*Item=NULL,int-length=1,LinkItem*Next=NULL)
:Length([this]{返回this->getLength();})
{
...

<代码>根本不编译:“当我开始使用C++时,我想为C语言中的库用户创建GET/SET糖语法。”你应该一直抵制尝试将习惯用法从一种语言移植到另一种语言的习惯。最好找到一种使用C++作为C++的方法,而不是C++的变体。C++没有属性,所以你不应该创建这个概念。代码>标准::列表
(更重要的是,如果要重建它,不要称它为向量。这很容易混淆)只需使用C++ C++标准库类型,很酷的文章,模仿聪明人在C++中的属性。我不会费心,但是如果你决定它是你想要的,那么它可能已经在那里做了。在cor初始化器列表中初始化它:代码>:长度(GETSLIN)。这在C++11中是允许的,但VC++还没有实现。是的。我只是想写一个链表来了解算法,我发现写get_变量和set_变量调用很烦人,因为它们只添加了类型而没有添加意义。不过我当然不应该尝试导入这样的东西。
struct Foo {
    int foo(void) {return 1;}
};

int main() {
    int (*var)() = &Foo::foo; // Error
    int (Foo::*var)() = &Foo::foo; // Okay
}
#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(); })
        {
...