相关疑难解决方法(0)

OS X 10.9 gcc链接到clang

我刚刚注意到在安装OS X 10.9之后,g ++编译器链接到clang编译器.无论如何还有恢复到gcc/g ++?

gcc g++ osx-mavericks

54
推荐指数
2
解决办法
5万
查看次数

C++类中定义的友元函数的成员访问控制

我知道以下 C++ 代码片段应该在 的定义中产生错误g,因为它p.t.x是私有的,无法在那里访问。

class P {
  class T {
    int x;
    friend class P;
  };
  T t;

  friend void g(P &p);
};

void g(P &p) { p.t.x = 42; }
Run Code Online (Sandbox Code Playgroud)

令我困惑的是下一个片段。不同之处仅在于朋友函数的定义g现在出现class 中P

class P {
  class T {
    int x;
    friend class P;
  };
  T t;

  friend void g(P &p) { p.t.x = 42; }
};
Run Code Online (Sandbox Code Playgroud)

Clang++(6.0.0-1ubuntu2 和 Apple 版本 clang-1100.0.33.8)编译后者没有错误,而 GNU C++(7.5.0-3ubuntu1~18.04)产生与前一个片段相同的错误。

我知道g后一种情况中定义的函数与前一种情况中定义的函数不在同一范围内(参见相关问题和 …

c++ g++ friend-function language-lawyer clang++

6
推荐指数
1
解决办法
119
查看次数

指定默认参数的朋友声明必须是定义

由于更新到XCode 5.1我的一个项目现在标题中有错误并且不会构建,我已经像以前一样将架构更改为32位,但仍然是同样的问题.

它所指的代码行是;

friend float 
    DistBetweenModels (ShapeModel* pModel1, ShapeModel* pModel2,
                        enEvalType nEvalType = ET_EyeDist, enDistType nDistType = DT_Max); 
Run Code Online (Sandbox Code Playgroud)

如果我删除'朋友'并离开'浮动'项目构建,但我不相信它正在做它应该做的事情.

c++ objective-c++ xcode5.1

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

为什么将朋友函数定义为结构的一部分 - boost thread_data?

我正在尝试理解一些导致PC-Lint悲伤的提升代码,并以一种我认为不合法的C++但在VS2008中编译好的方式使用friend关键字.

我以为我理解朋友是宣告课程和功能的一种方式.我认为在这样的函数定义上使用是不合法的.但是,MSDN页面非常具体:

可以在类声明中定义友元函数.这些函数是内联函数,就像成员内联函数一样,它们的行为就好像它们是在看到所有类成员之后但在类作用域关闭之前(类声明结束)之前立即定义的.

在类声明中定义的友元函数不在封闭类的范围内考虑; 他们在文件范围内.

所以我理解这是合法的,如果不寻常的语法.

我不确定它是什么,因为宣布朋友的正常原因是为了增加访问权限.但是,结构的成员默认都是公共的,因此这里没有这样的好处.

我错过了一些深刻的东西,或者这只是一些风格上的提升问题,有人不喜欢在结构体之后放入内联自由函数?

请注意,_InterlockedIncrement是Win32上的内部函数.

# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement

struct thread_data_base
{
    long count;
    detail::win32::handle_manager thread_handle;
    detail::win32::handle_manager interruption_handle;
    boost::detail::thread_exit_callback_node* thread_exit_callbacks;
    boost::detail::tss_data_node* tss_data;
    bool interruption_enabled;
    unsigned id;

    thread_data_base():
        count(0),thread_handle(detail::win32::invalid_handle_value),
        interruption_handle(create_anonymous_event(detail::win32::manual_reset_event,detail::win32::event_initially_reset)),
        thread_exit_callbacks(0),tss_data(0),
        interruption_enabled(true),
        id(0)
    {}
    virtual ~thread_data_base()
    {}

    friend void intrusive_ptr_add_ref(thread_data_base * p)
    {
        BOOST_INTERLOCKED_INCREMENT(&p->count);
    }
...
};
Run Code Online (Sandbox Code Playgroud)

更新

感谢Chubsdad在下面的回答,我想我现在明白了,我对正在发生的事情的总结:

  • 他们希望这些行为像自由函数一样,所以你可以编译 intrusive_ptr_add_ref(somePtrToThreadData)
  • 如果它们是在struct之后定义的自由函数,它们将在全局命名空间中可见
  • 使用友元限定符将它们放在struct中意味着它们在struct中作用域但不是成员函数,因此更像静态函数
  • 依赖于参数的查找意味着它们在被使用时将被发现,就好像它们是自由函数一样
    • 上述组合意味着它们就像使用自由函数语法的虚函数一样(将显式数据块作为参数而不是在其上调用)

c++ boost boost-thread

3
推荐指数
1
解决办法
1010
查看次数