1

OpenCL 为 cl.h 提供了一个只有头文件的 C++ 包装器,称为 cl.hpp。它附带了一些实现,但也可以从 khronos.org 获得,因为它只使用 OpenCL 库。

它包含很多模板和内联的东西,但也有这样的东西:

namespace cl
{
 class Buffer : public Memory
 {
  Buffer (...stuff...)
  {
   // Constructor implementation
  }

  // ...
  // Other Constructors and such
  // ...

  Buffer& operator= (const Buffer& rhs)
  {
   // implementation
  }

  // ...

  Buffer createSubBuffer (...)
  {
   // implementation
  }
 }
}

现在这是我的问题:那些在类定义中但既不是内联也不是模板化的实现不应该违反单一定义规则吗?我在这里错过了什么?

4

1 回答 1

5

C++ ISO

7.1.2/3:

在类定义中定义的函数是内联函数。内联说明符不应出现在块作用域函数声明中。如果在友元声明中使用了 inline 说明符,则该声明应为定义,或者该函数应先前已被声明为内联。

3.2/4:

每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义;无需诊断。定义可以显式出现在程序中,可以在标准或用户定义库中找到,或者(在适当时)隐式定义(参见 12.1、12.4 和 12.8)。内联函数应在使用它的每个翻译单元中定义

3.2/6:

类类型、枚举类型、带有外部链接的内联函数 (7.1.2)、类模板、非静态函数模板、类模板的静态数据成员、类模板的成员函数、类模板的成员函数可以有多个定义,如果每个定义出现在不同的翻译单元中,并且定义满足以下要求 [...]

于 2013-04-11T23:41:49.317 回答