我的母语是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是原始的,所以这不可能
这是怎么回事?
答案 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(); })
{
...