templateの宣言部と定義部を分ける

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
array

templateの宣言部と定義部を分ける

#1

投稿記事 by array » 16年前

C++におけるnamespaceとtemplateを用いて、宣言部と定義部を*.h、*.cppに分けて、*.hをインクルードすれば使えるようにしたいと考えています。

エラーメッセージは以下の通りです。

error LNK2019: 未解決の外部シンボル

エラーについて調べてみると、宣言を定義している.libがリンクされていないのが原因と書いてるのですが
コンパイルテストをしていると、templateを用いて使用するとエラーになっているみたいなので、リンクは
できているみたいです。

とりあえず、意味の無いエラー確認用のプログラムですが、アドバイスもらえるとありがたいです。
main.cpp(実行部) --------------------------------------------------
#include <iostream>
#include "test.h"

int main()
{
    int d = 10;

    test::Flag( d );

    return 0;
}



test.h(宣言部) ----------------------------------------------------
#pragma once

namespace test {
    template<typename T> bool Flag( T& target );
};


test.cpp(定義部) --------------------------------------------------
#include <iostream>
#include "test.h"

template<typename T>
bool test::Flag( T& target ) {
    return true;
}

たいちう

Re:templateの宣言部と定義部を分ける

#2

投稿記事 by たいちう » 16年前

テンプレートの実装はヘッダーファイルに書きましょう。
それが決まりです。

# と思ったら、ソースファイルに書くことができる場合もあるらしい。
# それでもお勧めはしませんけれど。
# http://d.hatena.ne.jp/ymotongpoo/20080115/1200373530

御津凪

Re:templateの宣言部と定義部を分ける

#3

投稿記事 by 御津凪 » 16年前

現状のコンパイラではテンプレートを外部に定義(.objに分ける)することは出来ないようです。

それについての詳細などはこちらの記事に載ってます。
ttp://fc2myblog.blog10.fc2.com/blog-entry-78.html

array

Re:templateの宣言部と定義部を分ける

#4

投稿記事 by array » 16年前

たいちうさん、御津凪さん有難うございます。勉強になりました♪

Justy

Re:templateの宣言部と定義部を分ける

#5

投稿記事 by Justy » 16年前

 解決済みですが、一応補足を。

 言語的には、その例でいうとtypenameの Tの型にどんな種類があるのか判っているなら、
templateの実装が cpp側にあったとしても明示的に実体化を行うことでリンクを通すこともできます。

 test.cpp側の適当なところに [color=#d0d0ff" face="sans-serif]template bool test::Flag(int&);[/color] を入れてみてください。

 これで int型に関してはリンクが通ります。
 int型以外の型……例えば floatにも対応するなら、 [color=#d0d0ff" face="sans-serif]template bool test::Flag(float&);[/color] のように書いていけばうまくいきます。

テンプレート関数の明示的な実体化 - パソコン・メモメモ備忘録
ttp://d.hatena.ne.jp/umonist/20080730/p3


 まぁ実際には事前に使う型が判っていないといけない、というのもあって
使いどころが微妙ですが……。

array

Re:templateの宣言部と定義部を分ける

#6

投稿記事 by array » 16年前

Justyさん、補足有難うございます。

URL先にも書いてある通り、ヘッダと定義部を分けないといけない場合が出てくるかもしれないので
覚えておきます

閉鎖

“C言語何でも質問掲示板” へ戻る