1

OpenCL は、cl.hpp と呼ばれる、cl.h のヘッダーのみの C++ ラッパーを提供します。いくつかの実装が同梱されていますが、OpenCL ライブラリのみを使用するため、khronos.org から入手することもできます。

多くのテンプレートとインラインのものだけでなく、次のようなものも含まれています。

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

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

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

  // ...

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

ここで私の質問です。クラス定義にはあるが、インラインでもテンプレート化でもない実装は、1 つの定義規則に違反するべきではありませんか? ここで何を見逃したのですか?

4

1 に答える 1

5

C++ ISO

7.1.2/3:

クラス定義内で定義された関数はインライン関数です。インライン指定子は、ブロック スコープの関数宣言には現れません。インライン指定子がフレンド宣言で使用されている場合、その宣言は定義であるか、関数は以前にインラインで宣言されている必要があります。

3.2/4:

すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数または変数の定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、odr-used であるすべての翻訳単位で定義されます。

3.2/6:

クラス型、列挙型、外部リンケージ持つインライン関数 (7.1.2)、クラス テンプレート、非静的関数テンプレート、クラス テンプレートの静的データ メンバー、クラス テンプレートのメンバー関数、または、各定義が異なる翻訳単位に表示され、定義が次の要件を満たすことを条件として、一部のテンプレート パラメーターがプログラムで指定されていないテンプレートの特殊化 [...]

于 2013-04-11T23:41:49.317 に答える