小编nri*_*lin的帖子

可以在声明它们的命名空间之外定义类成员吗?

有时候我会找到类似下面的代码(实际上有些类向导会创建这样的代码):

// C.h
namespace NS {

class C {
    void f();
};

}
Run Code Online (Sandbox Code Playgroud)

并在实现文件中:

// C.cpp
#include "C.h"

using namespace NS;
void C::f() {
  //...
}
Run Code Online (Sandbox Code Playgroud)

我试过的所有编译器都接受那种代码(gcc,clang,msvc,compileonline.com).是什么让我感到不舒服的是using namespace NS;.从我的观点来看,C::f()生活在全局命名空间中的环境中,该环境对生活在命名空间NS中的对象具有不合格的访问权限.但是在编译器的观点中void C::f()存在namespace NS.正如我尝试的所有编译器都分享了这一观点,他们可能是正确的,但是标准中的这个意见得到了支持?

c++ namespaces using-directives language-lawyer c++11

14
推荐指数
1
解决办法
912
查看次数

包含1个指针的结构的大小

假设我有以下类模板:

template<typename T>
struct Wrapper {
  T* t_;
  static void check() {
    static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
  }
};
Run Code Online (Sandbox Code Playgroud)

我在C++ 03标准中查看了C99标准,并且找不到我在假设中表达的保证static_assert.我使用几个编译器选项在Visual C++ 2008和2010(32位)以及linux(64位)上使用gcc进行了尝试,并发现了我的假设.

我的问题是:

  • 对于Visual C++ 2008/2010/11(windows),我的假设是否合理?
  • 对于gcc 4.*(linux)?
  • 对于编译器标志的任何组合?
  • 你知道这个假设不成立的任何编译器/平台吗?

我想编译器可能会在结构中添加一些填充,例如用于调试目的.但有没有一个编译器实际上这样做?

编辑:所以你在这里问的是我想要实现的目标:
我有一个带有以下签名的成员函数:

Someclass* OtherClass::fn();
Run Code Online (Sandbox Code Playgroud)

我想改变这样的签名:

Wrapper<Someclass> OtherClass::fn();
Run Code Online (Sandbox Code Playgroud)

这个包装器就像一些智能指针,即它关心指针的生命周期,因此当它超出范围时它会释放它.当函数跨越dll边界调用时,我想确保返回的值(现在是一个具体类型,而不仅仅是一个哑指针)在与指针大小相同的所有情况下(即编译器设置等)将会.计划/希望是支持调试/发布应用程序/ dll构建的所有组合.
你可能会问:不,我不能使用boost :: shared_ptr <>,std :: shared_ptr <>,std :: unique_ptr <>等,因为我们不希望向dll用户公开boost,我们不支持C++ 11.

c++ g++ visual-c++

5
推荐指数
1
解决办法
189
查看次数