std shared_pointer_cast 未定义
std shared_pointer_cast not defined
我正在尝试在 apache arrow C++ example 中记下的示例示例。
该示例使用如下共享的尖头转换(代码片段)
版本
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;
}
编译标志
但是,当我使用以下标志编译代码时,出现未定义错误。
g++ example.cpp -O2 -std=c++11 -I/workspace/arrow/arrow-master/cpp/src -L/workspace/arrow/arrow-master/cpp/release/release -larrow -larrow_jemalloc
错误
example.cpp: In function 'int main()':
example.cpp:24:44: error: 'shared_pointer_cast' is not a member of 'std'
std::shared_ptr<Int64Array> int64_array = std::shared_pointer_cast<Int64Array>(array);
^
example.cpp:24:79: error: expected primary-expression before '>' token
std::shared_ptr<Int64Array> int64_array = std::shared_pointer_cast<Int64Array>(array);
我没有看到 std::shared_pointer_cast
的任何文档
问题
- 我是不是遗漏了什么,这是c++11版本的可编译代码吗?
- 在 C++11 版本中有什么替代方案?
您应该根据自己的意图使用 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
不执行运行时检查。如果您知道您引用的是特定类型的对象,则应该使用它,因此不需要检查。它还用于避免隐式转换,而是将其显式化
dynamic_cast
用于不知道对象的动态类型是什么的情况。如果向下转型并且参数类型不是多态的,则不能使用 dynamic_cast。一个例子:
Regular cast
是 C 风格的转换,它结合了所有 const_cast
、static_cast
和 reinterpret_cast
,但它也不安全。
查看 this answer 以了解有关 C++ 中使用的强制转换的更多信息。
我正在尝试在 apache arrow C++ example 中记下的示例示例。 该示例使用如下共享的尖头转换(代码片段)
版本
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;
}
编译标志
但是,当我使用以下标志编译代码时,出现未定义错误。
g++ example.cpp -O2 -std=c++11 -I/workspace/arrow/arrow-master/cpp/src -L/workspace/arrow/arrow-master/cpp/release/release -larrow -larrow_jemalloc
错误
example.cpp: In function 'int main()':
example.cpp:24:44: error: 'shared_pointer_cast' is not a member of 'std'
std::shared_ptr<Int64Array> int64_array = std::shared_pointer_cast<Int64Array>(array);
^
example.cpp:24:79: error: expected primary-expression before '>' token
std::shared_ptr<Int64Array> int64_array = std::shared_pointer_cast<Int64Array>(array);
我没有看到 std::shared_pointer_cast
问题
- 我是不是遗漏了什么,这是c++11版本的可编译代码吗?
- 在 C++11 版本中有什么替代方案?
您应该根据自己的意图使用 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
不执行运行时检查。如果您知道您引用的是特定类型的对象,则应该使用它,因此不需要检查。它还用于避免隐式转换,而是将其显式化
dynamic_cast
用于不知道对象的动态类型是什么的情况。如果向下转型并且参数类型不是多态的,则不能使用 dynamic_cast。一个例子:
Regular cast
是 C 风格的转换,它结合了所有 const_cast
、static_cast
和 reinterpret_cast
,但它也不安全。
查看 this answer 以了解有关 C++ 中使用的强制转换的更多信息。