【发布时间】:2013-11-18 23:44:46
【问题描述】:
我正在尝试将一些代码从boost::tuple 迁移到std::tuple,但我遇到了一些奇怪的错误:在我调用using namespace std(而不是boost)之后,我希望解决一个不合格的tie到std::tie。但是,例如,当元组包含 boost 容器指针时,这似乎会失败。
#include <tuple>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/identity.hpp>
#ifdef USE_STD
#define TIE std::tie
#else
#define TIE tie
#endif
typedef boost::multi_index_container<
int,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique<
boost::multi_index::identity<int>
>
>
> Set;
std::tuple< int, int* > make_i_ptr();
std::tuple< int, Set* > make_set();
int main()
{
using namespace std;
int i;
int* i_ptr;
Set* set_ptr;
tie(i, i_ptr) = make_i_ptr();
TIE(i, set_ptr) = make_set();
return 0;
}
如果我用g++ -std=c++0x -c test.cpp -DUSE_STD 编译,一切都很好。但是,如果没有-D USE_STD,我会收到提示g++ 尝试使用boost::tuples::tie 的编译错误。我正在使用 g++ 4.8.1 和 boost 1.55.0。你认为这是boost的错误吗?还是我缺少一些规范?
【问题讨论】:
-
这是 ADL。对两者都使用限定名称。
-
"在我调用
using namespace std之后" - NO -
@Xeo:我不在头文件中。即,IRL,fcn 定义在没有
using的头文件中,这就是为什么我把它放在main()这里。除此之外,这是一种偏好而非规则。 -
你说“医生,我这样做会很痛。”医生说“不要那样做”。这确实是事情的工作方式(而不是 Boost 中的错误)。
-
@chris:谢谢,我不知道 ADL。但我不明白:听起来 ADL 应该帮助编译器解析名称。如果 ADL 让它解析为 boost::tie for...“我的方便”,然后编译失败,这不应该是编译器选择错误函数的线索吗?!
标签: c++ boost c++11 boost-tuples stdtuple