[解決済み] クラステンプレートでの演算子のオーバーロード
2022-02-28 06:03:54
質問
テンプレート・クラスの演算子オーバーロードの定義に問題があります。この仮想的なクラスを例にとってみましょう。
template <class T>
class MyClass {
// ...
};
-
operator+=
// In MyClass.h MyClass<T>& operator+=(const MyClass<T>& classObj); // In MyClass.cpp template <class T> MyClass<T>& MyClass<T>::operator+=(const MyClass<T>& classObj) { // ... return *this; }
このコンパイラーエラーが発生します。
no match for 'operator+=' in 'classObj2 += classObj1'
-
演算子<<
// In MyClass.h friend std::ostream& operator<<(std::ostream& out, const MyClass<T>& classObj); // In MyClass.cpp template <class T> std::ostream& operator<<(std::ostream& out, const MyClass<T>& classObj) { // ... return out; }
このコンパイラの警告が表示されます。
friend declaration 'std::ostream& operator<<(std::ostream&, const MyClass<T>&)' declares a non-template function
何が間違っているのでしょうか?
どうすればいいですか?
// In MyClass.h
MyClass<T>& operator+=(const MyClass<T>& classObj);
// In MyClass.cpp
template <class T>
MyClass<T>& MyClass<T>::operator+=(const MyClass<T>& classObj) {
// ...
return *this;
}
テンプレートでは無効です。演算子の完全なソースコードは、それが使用されるすべての翻訳ユニットに含まれていなければなりません。これは通常、コードがヘッダーの中にインラインで存在することを意味します。
編集:技術的には、標準によれば、テンプレートのエクスポートは可能ですが、サポートしているコンパイラはごくわずかです。また、MyClass.cppでT-であるすべての型に対して明示的にテンプレートをインスタンス化すれば、上記のようなことも可能ですが、現実には、それはテンプレートの意味を無視することになります。
もっと編集する:あなたのコードを読みましたが、例えばoperator[]のオーバーロードなど、いくつかの作業が必要です。さらに、典型的には、私は次元をテンプレートパラメータの一部にし、コンパイル時に+または+=の失敗を捕らえることを可能にし、型を意味のあるスタックアロケートすることを可能にします。例外クラスもstd::exceptionから派生させる必要があります。しかし、これらはいずれもコンパイル時のエラーには関係なく、単に素晴らしいコードではありません。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】 ostreamの<<演算子を適切にオーバーロードする方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない