我正在尝试在apache arrow C ++ example中记下的示例示例。 该示例使用共享尖头转换如下(代码片段)
版本
static synchronized
代码
SELECT REPLACE('"test"','"','"')
编译标志
但是,当我用下面的标志编译代码时,我得到了未定义的错误。
void foo(void) {
#if TARGET_CPU_ARM64
__asm ("sub sp, sp, #0x60");
__asm ("str x29, [sp, #0x50]");
#endif
}
错误
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3aka8.0.2) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我没有看到int main()
{
Int64Builder builder(arrow::default_memory_pool(), arrow::int64());
builder.Append(8);
std::shared_ptr<Array> array;
builder.Finish(&array);
std::shared_ptr<Int64Array> int64_array = std::shared_pointer_cast<Int64Array>(array);
return 0;
}
问题
答案 0 :(得分:3)
根据您的意图,您应该使用static_pointer_cast
或dynamic_pointer_cast
。
以下是C ++ 11中支持的所有演员表:
http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast
但是,在C ++ 11中没有任何名为std::shared_pointer_cast
此外static_cast应该适合您。请尝试static_cast
而不是std::shared_pointer_cast
使用演员表时要考虑的重要事项:
static_cast
不执行运行时检查。如果您知道引用特定类型的对象,则应使用此方法,因此不需要进行检查。它还用于避免隐式转换&amp;而是明确地说明
dynamic_cast
用于您不知道对象的动态类型的情况。如果你是向下转换并且参数类型不是多态的,则不能使用dynamic_cast。一个例子:
Regular cast
是一个C风格的演员表,它结合了所有const_cast
,static_cast
和reinterpret_cast
,但它也不安全。
查看this answer以了解有关C ++中使用的强制转换的更多信息。