constexpr クラスをヘッダで宣言し、別の .cpp ファイルで定義することは可能ですか?
質問
私は、クラス
Dimension
というクラスがあり、(他のクラスと同様に)Dimension.hというファイルで定義しています。
class Dimension
{
public:
constexpr Dimension() noexcept;
constexpr Dimension(int w, int h) noexcept;
int width;
int height;
};
他のクラスと同じように、別のDimension.cppに定義を置くことができると思いました。
#include "Dimension.h"
constexpr Dimension::Dimension() noexcept : width(0), height(0) {}
constexpr Dimension::Dimension(int w, int h) noexcept : width(w), height(h) {}
しかし、このクラスを使おうとすると、コンパイラが教えてくれます。
警告: インライン関数 '
constexpr Dimension::Dimension()
' が使用されていますが、定義されていません。
とリンクしている間に
への未定義の参照'
pong::graphics::Dimension::Dimension()
'
(他のコンストラクタと同じ)
このようにヘッダでクラスを定義すると
class Dimension
{
public:
constexpr Dimension() noexcept : width(0), height(0) {}
constexpr Dimension(int w, int h) noexcept : width(w), height(h) {}
int width;
int height;
};
で、.cppファイルを省略すると、すべて正常に動作します。
GCC 4.9.2を使っています。なぜ分離定義が機能しないのでしょうか?
どうすれば解決しますか?
もし
constexpr
関数がヘッダ内部で定義されていない場合、コンパイラは
constexpr
関数が定義されていないため、コンパイラーは他の全てのソースファイルをコンパイルしている間、
明らかに、もし関数の定義を見ることができなければ、コンパイル時に関数を計算するために必要なステップを実行することができません。したがって、すべての
constexpr
関数は、それらが使用されるすべての場所で定義されなければなりません。
ありがとう、@IgorTandetnik。
[dcl.constexpr] §7.1.5/2
constexpr
の関数とconstexpr
コンストラクタは暗黙のうちにインライン化されます。
[基本.def.odr] §3.2/4
インライン関数は、それがodrで使用されるすべての翻訳単位で定義されなければならない。
関連
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] C++でenumを前方に宣言する
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。