我想将POD类型用作某些结构的代理。更确切地说,我尝试做以下事情:
struct Foo { /* some fields */ };
extern Foo global_array[SIZE]; // initialized elsewhere
struct Proxy
{
Foo* pointer_;
}
Proxy get_first_element_as_pointee()
{
return &global_array[0];
}
在上面的代码中,我有一个包含Foo结构的全局C数组,我想得到第一个。但是,我不想暴露Foo而是代理。问题是转换不起作用。我收到以下错误消息:
错误:无法转换'& global_array [0]'从'Foo *'到'Proxy'{return& global_array [0]; }
编辑:我修改了我的问题,以便更清楚
答案 0 :(得分:0)
get_first_element_as_pointee()
尝试返回Foo*
,但需要Proxy
。编译器引发错误,因为它“不知道”如何将Foo*
转换为Proxy
。
虽然我很欣赏Yola的伎俩,但我的情况有点不同而且更简单:
“解释”的一种可能方法是为struct Proxy
定义转换构造函数:
struct Foo { /* some fields */ };
extern Foo global_array[SIZE]; // initialized elsewhere
struct Proxy
{
Foo* pointer_;
// This is the trick: provide a "conversion constructor".
Proxy(Foo *pointer): pointer_(pointer) { }
};
Proxy get_first_element_as_pointee()
{
return &global_array[0];
}
回顾POD类型的实际含义(问题标题中需要),这个答案可能还不够。
根据SO: Can't C++ POD type have any constructor?的答案:
该死的 - 我的错。
POD
表示普通旧数据类型,根据定义,它不能具有用户定义的构造函数。
另一个答案(没有转换构造函数甚至更简单)并且最初由@bolov提供但删除了:
struct ProxyPOD
{
Foo* pointer_;
};
ProxyPOD get_first_element_as_pointee2()
{
ProxyPOD proxy = { &global_array[0] }; // as you would do in C
return proxy;
}