←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3688

templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---あかま(2005/04/25 03:44:11)


templateを使ったclass abcdがあり、それを継承したclass aaaがあります。
それらの情報はヘッダファイル"class.h"に入っており、クラスの実体は"class.cpp"に入っています。
#include "class.h"をした、main()ソースファイル"jikken.cpp"をコンパイル,リンクすると

g++ -c jikken.cpp class.cpp
g++ -o jikken jikken.o class.o

とすると
jikken.o(.text+0x53): In function 'main':
: undefined reference to 'abcd<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::status(std::basic_string<char, std::char_traits<char>,std::allocator<char> >)'
と出てclass abcdのabcd::status()が見つからずリンクできないようなのです。

ところが、同じmain()で、
#include "class.cpp"とした、ソースファイル"jikken2.cpp"をコンパイル,リンクすると
g++ -c jikken2.cpp
g++ -o jikken2 jikken2.o

エラーなく終了します。
なぜ同じ内容を分割コンパイル,リンクするとメンバー関数が見えなくなるのか不思議なのですが、
どなたか原因のわかる方いらっしゃいますか?
bccとgccで試しましたが両方とも同様のエラーがでます。
templateを取り去るとうまくいくので、これが原因のようなのですが。

/***************class.h***************/
#include <iostream>
#include <string>

using namespace std;

template<class T> class abcd{
    protected:
    vector<T> vec;
    string Status;
    public:
    void status(const string str);
};


class aaa:public abcd<string>{
    public:
    void print(){cout << Status << endl;}
};


/***************class.cpp**************/
#include "class.h"

template<class T> void abcd<T>::status(const string str){
    Status = str;
}
/***************jikken.cpp**************/
#include "class.h"
using namespace std;

int main(){
    aaa a;
    a.status("1234");
    a.print();
    return 0;
}

/***************jikken2.cpp**************/
#include "class.cpp"
using namespace std;

int main(){
    aaa a;
    a.status("1234");
    a.print();
    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない 3689 Ban 2005/04/25 03:53:39


No.3689

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---Ban(2005/04/25 03:53:39)


export をまともにサポートしたコンパイラがほぼ存在しないため、
現状で template の分割コンパイルを行うことは現実的に不可能です。
実装は全て inline にしてヘッダにおく必要があります。

# できることなら私も分割したい.....。


この投稿にコメントする

削除パスワード

No.3690

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---Ban(2005/04/25 03:59:07)


提示のように実装を直接 include しても結果的に一緒です。
単一の translation unit 内でしか include しないなら、
勿論 inline は必須ではありません。

.inl (inline)とか .impl (implementation) とか言う拡張子に
して .cpp と区別してる人とかもいますね....。



この投稿にコメントする

削除パスワード

No.3691

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---あかま(2005/04/25 05:18:40)


レスありがとうございます。

そうですか、コンパイラの都合でしたか。
templateはリンカが裏でコンパイラまがいのことをやっているというのを
ちらっと耳にしたことがあったのですが、うまく動いてはいないのですね。
inlineで書いてみようと思います。


templateを初めて使ったので分割が原因と気づくまで10時間以上。
600行ぐらいの元プログラムを弄くり倒してました。
ちょっとくやしい。。。



この投稿にコメントする

削除パスワード

No.3692

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---くま(2005/04/26 18:02:26)


あかまさん。Banさん始めまして。

本題からは、かなりそれてしまっているかと思いますが少々私見をm(__)m

># できることなら私も分割したい.....。

私も基本的には同感です(広義でとらえますと分割の定義が難しい)()内は、
正式な用語ではなく、個人的な感覚ですので悪気は御座いません。

>templateを初めて使ったので分割が原因と気づくまで10時間以上。
>600行ぐらいの元プログラムを弄くり倒してました。
>ちょっとくやしい。。。

近くない過去(でも、さほど遠くはないです)に似た経験があります。

こちらのHPの記述に間違いがなければ継承のみなら出来そうですが

私の環境下では出来ませんね..... WIN98+BCCです

あかまさんが提示されたソースですが、既に気づいているかと。一応。
多分約600行の中のソースには入っておられるかと。class.hの中で、
vectorをお使いなので、#include<vector>が必要かと。今回提示されました、
ソースでは、vector<T> vec; を、コメント化すれば差し使いはありませんが、
何気無く、気になりましたので。他意は御座いませんので。


この投稿にコメントする

削除パスワード

No.3693

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---あかま(2005/04/26 19:32:30)


>vectorをお使いなので、#include<vector>が必要かと。今回提示されました、
>ソースでは、vector<T> vec; を、コメント化すれば差し使いはありませんが、
>何気無く、気になりましたので。他意は御座いませんので。
ご指摘ありがとうございます。#include<vector>が抜けていました。

その上、コードの継承をなくしても同様のリンクエラーが出ますので、継承は関係ないようです。
リンクできるメンバー関数と出来ないものがあるので、色々試しているうちに、おかしな事になってしまったようです。


この投稿にコメントする

削除パスワード

No.3694

Re:templateを使ったクラスを分割コンパイルするとメンバー関数が見つからない
投稿者---Ban(2005/04/27 10:58:38)


>私も基本的には同感です(広義でとらえますと分割の定義が難しい)()内は、
>正式な用語ではなく、個人的な感覚ですので悪気は御座いません。

一応、言語標準(ISO/IEC14882:1998)定義の export が使えればまだなぁ、
という狭義で書いたつもりでしたが、広義ではむやみに実装をさらしたくない。


>>templateを初めて使ったので分割が原因と気づくまで10時間以上。
-- snip --
>近くない過去(でも、さほど遠くはないです)に似た経験があります。

まぁ私も結構昔に......orz


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity