有没有一种方法可以在不污染名称空间的情况下使用boost::assign运算符? 我试图避免在C++中使用“命名空间”,以免污染我的命名空间。但是,我想使用boost赋值运算符来执行以下操作: std::vector tmp; tmp += "abc","def","asdf","foo","blah","dfkef"; std::载体tmp; tmp+=“abc”、“def”、“asdf”、“foo”、“blah”、“dfkef”;

有没有一种方法可以在不污染名称空间的情况下使用boost::assign运算符? 我试图避免在C++中使用“命名空间”,以免污染我的命名空间。但是,我想使用boost赋值运算符来执行以下操作: std::vector tmp; tmp += "abc","def","asdf","foo","blah","dfkef"; std::载体tmp; tmp+=“abc”、“def”、“asdf”、“foo”、“blah”、“dfkef”;,c++,boost,namespaces,operators,C++,Boost,Namespaces,Operators,如果不添加“using namespace boost::assign”,则会产生错误: error: no match for 'operator+=' in 'tmp += "abc"' 错误:“tmp+=“abc”中的“operator+=”不匹配 有没有一种方法可以在boost中使用这些运算符而不使用名称空间?您错误地认为它会污染名称空间:使用名称空间的功能正是为这种用途而创建的 它只会“污染”使用命名空间的的范围,在这种情况下,好处(使用操作符)远远大于缺点(这种“污染”与范围的大小一

如果不添加“using namespace boost::assign”,则会产生错误:

error: no match for 'operator+=' in 'tmp += "abc"' 错误:“tmp+=“abc”中的“operator+=”不匹配
有没有一种方法可以在boost中使用这些运算符而不使用名称空间?

您错误地认为它会污染名称空间:使用名称空间的
功能正是为这种用途而创建的

它只会“污染”使用命名空间的
的范围,在这种情况下,好处(使用操作符)远远大于缺点(这种“污染”与范围的大小一样可以忽略不计)

例如,您可以:

void foo()
{
   // no symbol of boost::assign is polluting here

   std::vector tmp;

   {
      using namespace boost::assign ;
      // brings in this scope all the symbols of boost::assign
      tmp += "abc","def","asdf","foo","blah","dfkef";
   }

   // no symbol of boost::assign is polluting here
}
您应该在
使用名称空间所带来的语法优势和它可能带来的潜在污染之间找到一个平衡点

一个好的折衷办法是将其限制在函数体中,或者,如果您像我一样偏执,使用
语句为这个
创建一个范围


有趣的是,最糟糕的解决方案是将using放在带有导出符号的公共标题中。

我认为如果您的函数足够大,可以为
using
语句引入作用域,那么您的函数应该被拆分,或者您的标准太严格,而且using语句对函数的其余部分没有影响,所以引入scope没有意义。@GMan:我想你是对的。这就是为什么我写了“一个好的折衷方案可能是将它限制在一个函数体中”,以及为什么写一个作用域被限定为“偏执狂”的原因。。。。你说得对。我看了一下assign的头文件,看起来定义非常少,我想部分原因是为了便于以这种方式使用名称空间。