質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • C++

    4069questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    1643questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • make

    81questions

    make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

  • g++

    13questions

    g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

C++のtemplateとoperatorで躓いています

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 180

aaaaaaf

score 3

 前提・実現したいこと

ヘッダとソースファイルを分けてクラステンプレートで演算子のオーバーロードをしたいです

ここに質問の内容を詳しく書いてください。

ヘッダでメンバ関数のプロトタイプ宣言、ソースファイルで記述したところエラーが出ます
検索して修正したりしたのですが別のエラーが出るだけでした

 発生している問題・エラーメッセージ

エラーメッセージ
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

template関数の定義と宣言は同じところに書きましょう。それが一番楽。定義と宣言を分けるのはまあなんとかなるとして、翻訳単位は分けるのは至難の業です。というかC++の著名なライブラリ(Boostとか)も分けていません。

いや、explicit instantiationとかextern templateあるやろという話もあるかもしれませんが、多分質問者のやりたいことは解決できないので、すなおにヘッダーオンリーにしてしまいましょう。どうしてもコンパイル時間が気になるときは適宜pimplイデオムで逃げましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/04 14:58

    ありがとうございます
    定義と宣言をわけないほうがよいのですね
    次からはそうします

    キャンセル

同じタグがついた質問を見る

  • C++

    4069questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    1643questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • make

    81questions

    make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

  • g++

    13questions

    g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。