C++のtemplateとoperatorで躓いています
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 655
前提・実現したいこと
ヘッダとソースファイルを分けてクラステンプレートで演算子のオーバーロードをしたいです
ここに質問の内容を詳しく書いてください。
ヘッダでメンバ関数のプロトタイプ宣言、ソースファイルで記述したところエラーが出ます
検索して修正したりしたのですが別のエラーが出るだけでした
発生している問題・エラーメッセージ
エラーメッセージ
color.cc:5:16: error: ‘T’ was not declared in this scope
Color<V> Color<T>::operator= (const Color<U>&) {
^
color.cc:5:17: error: template argument 1 is invalid
Color<V> Color<T>::operator= (const Color<U>&) {
^
color.cc:5:46: error: ‘Color<U> operator=(const Color<V>&)’ must be a nonstatic member function
Color<V> Color<T>::operator= (const Color<U>&) {
該当のソースコード
C++
####ヘッダファイル側
template<class T>
class Color {
(略)
template<typename U, typename V>
Color<V> operator= (const Color<U>&) &;
####ソースファイル側
template<typename U, typename V>
Color<V> Color<T>::operator= (const Color<U>&) {
}
ソースコード
試したこと
ソースファイル側のテンプレートにTの追加したが別のエラー
color.cc:5:10: error: prototype for ‘Color<V> Color<T>::operator=(const Color<U>&)’ does not match any in class ‘Color<T>’
Color<V> Color<T>::operator= (const Color<U>&) {
^~~~~~~~
In file included from color.cc:1:0:
rt05.h:34:11: error: candidates are: template<class T> template<class U> Color<T> Color<T>::operator=(const Color<T>&) &
Color<T> operator= (const Color<T>&) &;
^~~~~~~~
rt05.h:31:11: error: template<class T> template<class U, class V> Color<V> Color<T>::operator=(const Color<U>&) &
Color<V> operator= (const Color<U>&) &;
^~~~~~~~
補足情報(FW/ツールのバージョンなど)
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
make -v
GNU Make 4.1
このプログラムは x86_64-pc-linux-gnu 用にビルドされました
Copyright (C) 1988-2014 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです: 自由に変更および配布できます.
法律の許す限り、 無保証 です.
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
template関数の定義と宣言は同じところに書きましょう。それが一番楽。定義と宣言を分けるのはまあなんとかなるとして、翻訳単位は分けるのは至難の業です。というかC++の著名なライブラリ(Boostとか)も分けていません。
いや、explicit instantiationとかextern templateあるやろという話もあるかもしれませんが、多分質問者のやりたいことは解決できないので、すなおにヘッダーオンリーにしてしまいましょう。どうしてもコンパイル時間が気になるときは適宜pimplイデオムで逃げましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/10/04 14:58
定義と宣言をわけないほうがよいのですね
次からはそうします