パラメータ化されたテンプレートメソッドの明示的なインスタンス化

c++ class instantiation templates
パラメータ化されたテンプレートメソッドの明示的なインスタンス化

2つの異なるテンプレートクラスがあり、1つは別のテンプレートクラスのオブジェクトをパラメーターとして使用します。 エラーメッセージが表示されます:collect2:ldが1つの終了ステータスを返しましたmake:_ * _ [main] Error 1

私はテンプレートの明示的なインスタンス化に取り組んでおり、関連する投稿をいくつか見つけましたが、それらはほとんど単一のテンプレートクラスのインスタンス化に関連していました。 私の場合、クラスごとに3つのファイル(.h、.cpp、
.inc following http://www.parashift.com/c++-faq/templates.html#faq-35.13
提案)。

foo.cpp

  ...
  template < class S >
  Foo::Foo(){ .... }
  ...
  #include "foo.inc"

foo.inc

 template class Foo;
 template class Foo;

bar.h

 #ifndef BAR_H
 #define BAR_H
 #include
 template < class T >
 class Bar{
    public: ...
           template
           void doSomething(Foo*);
    private: ...
 };
 #endif

bar.cpp

  ....
  template  template
  void Bar::doSomething(Foo*p){
      ....
  }
  .....
  #include "bar.inc"

bar.inc

 template class Bar;
 template class Bar;
 template void Bar::doSomething(Foo*);
 template void Bar::doSomething(Foo*);

mylib.h

 #include
 #include

main.cpp

#include
#include

int main(){
    Foo * pFoo = NULL;
    pFoo = new Foo();

    Bar * pBar = NULL;
    pBar = new Bar();
    pBar->doSomething(pFoo);

    delete pFoo;
    delete pBar;

    return (0);
}

オブジェクトのインスタンス化の途中で誰かが問題/バグを見ますか? 完全なエラーメッセージは次のとおりです(クラスの名前を変更し、コードを簡略化してわかりやすくしました)。

 g++ -O3 -Wall main.cpp -o ../bin/main -I../inc -L../lib -lmylib -lm
 /tmp/cciJHsKr.o: In function `main':
 main.cpp:(.text+0x19f): undefined reference to `void Bar::doSomething(Foo*)'
 collect2: ld returned 1 exit status
 make: *** [main] Error 1

ライブラリを生成しているため、foo.cppとbar.cppの両方を個別にコンパイルすることに注意してください。

 // Makefile for foo.cpp & bar.cpp
 INC=./inc
 SRC=./src
 LIB=./lib
 OBJ=./obj

 CC=g++
 CFLAGS=-O3 -Wall

 mylib: $(LIB)/mylib.a
      echo "mylib was created!..."

 $(LIB)/mylib.a: \
 $(OBJ)/bar.o \
 $(OBJ)/foo.o
ar csr $(LIB)/mylib.a \
 $(OBJ)/bar.o \
 $(OBJ)/foo.o \


 $(OBJ)/bar.o: $(SRC)/bar.cpp
      $(CC) -c $(CFLAGS) $(SRC)/bar.cpp -I$(INC) \
      -o $(OBJ)/bar.o

  2  0


ベストアンサー

私は問題を解決します!

bar.h

#ifndef BAR_H
#define BAR_H
#include
template < class T >
class Bar{
    public: ...
       template
       void doSomething(fooType*);
    private: ...
};
#endif

bar.cpp

#include
#include
...
...
template  template
void Bar::doSomething(fooType*p){
  ....
}
.....
#include "bar.inc"

bar.inc

#include

template class Bar;
template class Bar;
template void Bar::doSomething(Foo*);
template void Bar::doSomething(Foo*);

2


現時点ではGCCセットアップの環境がないので、ここで盲目的に飛んでいます。

あなたのコードにはいくつかの問題があるようです(私のメンタルコンパイラが見ているように)。

  1. bar.cppでは、 `doSomething()`関数のスコープを設定していません。 与えられた

    `Bar

    doSomething()が必要な別のヘッダーで宣言されています。 バーがテンプレート化されている場合、バインディングも提供する必要があります。 `Bar :: doSomething()

  2. bar.cppでは、テンプレートバインディングは間違った方法であるように見えます

    (例では任意ですが、明確にするために、以下のように変更します: `template template void Bar

    doSomething(Foo * p){…​ }`

  3. 最後に、 main()`には問題があります。
    ヒープ上の `Foo`オブジェクト-コンパイラはこれをキャッチする必要があると思います(
    Foo`を Foo *`に割り当てる)。 「新しい」キーワードを見逃したばかりだと思います。 `pFoo = new Foo();

1


タイトルとURLをコピーしました