我可以将iostream头文件包含到自定义命名空间中吗?

时间:2009-07-30 02:17:43

标签: c++ namespaces std aliasing

namespace A
{
   #include <iostream>
};

int main(){
 A::std::cout << "\nSample";
 return 0;
}

2 个答案:

答案 0 :(得分:8)

简短回答:不。

答案很长:嗯,不是真的。不过你可以假装它。您可以在外部声明它并在命名空间内使用using语句,如下所示:

#include <iostream>

namespace A
{
   using std::cout;
};

int main(){
 A::cout << "\nSample";
 system("PAUSE");
 return 0;
}

您无法本地化库,因为即使它在A中具有访问权限,也无法在标准命名空间中进行访问。

此外,“另一个问题是命名空间内的限定名称是A :: std :: cout,但该库不包含使用外部命名空间限定的名称。”谢谢Jonathon Leffler。

如果问题是你不想让其他人知道你的所有代码可以做什么,你可以拥有自己的cpp文件来包含iostream,并在那里定义命名空间。然后你只需将它包含在main(或其他)中,让程序员知道他能做什么,不能做什么。

答案 1 :(得分:5)

你可以写:

#include <vector> // for additional sample
#include <iostream>
namespace A
{
  namespace std = std; // that's ok according to Standard C++ 7.3.2/3
};

// the following code works
int main(){
 A::std::cout << "\nSample"; // works fine !!!
 A::std::vector<int> ints;
 sort( ints.begin(), ints.end() );  // works also because of Koenig lookup

 std::cout << "\nSample";  // but this one works also
 return 0;
}

Thit方法称为命名空间别名。该功能的真正目的在以下示例中显示:

namespace Company_with_very_long_name { /* ... */ }
namespace CWVLN = Company_with_very_long_name;

// another sample from real life
namespace fs = boost::filesystem;
void f()
{
  fs::create_directory( "foobar" );   // use alias for long namespace name
}