2017-08-29 44 views
0

我尝试使用升压::可选我怎样才能返回字符数组的boost ::可选

boost::optional<const char *> foo() { 
    char ar[100] = {}; 
    return boost::make_optional(true, ar); 
} 

返回简单数组,我得到了以下错误:

could not convert ‘boost::make_optional(bool, const T&) [with T = char [100]](ar)’ from ‘boost::optional<char [100]>’ to ‘boost::optional<const char*>’ return boost::make_optional(true, ar); 

我该如何处理如此混乱?

+0

呃,你*不要!*如果你想有一个字符串,然后使用'std :: string'。如果你想要一个运行时可变的向量,然后使用'std :: vector'。如果你想要一个在编译时固定大小的数组,然后使用'std :: array'。 –

+0

至于你的问题,数组不是指针,指针也不是数组。再次阅读错误消息,并查看它推断出“ar”的类型。然后将它与您所说的返回类型进行比较。 –

+0

但我知道数组的名称是指向数组的第一个元素的指针。奇怪... –

回答

1

boost::make_optional推断archar [100]型,但它预计const char *。默认情况下隐式转换不会在模板参数推演中发生。

如果你想使用原始指针,可以采用如下方案:

boost::optional<const char *> foo() { 
    char ar[100] = {}; 
    return boost::make_optional(true, static_cast<const char *>(ar)); 
} 

但在这种情况下,你丢失信息的方式和位于该数组中的许多元素可能更好地在foo()功能使用std::vectorstd::arraysehe

祝你好运!

3

最接近你可以做的是通过使用包含值的语义。

也就是说包装物上std::array

boost::optional<std::array<char, 100> > foo() { 
    std::array<char, 100> ar {}; 
    return boost::make_optional(true, ar); 
} 

关于数组指针对比: