0

ライブラリのコーディングを開始し、テストを行うことにしましたが、質問のタイトルにエラーが表示されます (Mac OSX、gcc-4.7.1):

tlib.cpp:

template <typename T>
T dobra(const T& valor){
  return valor*2;
}

tlib.h:

template <typename T>
T dobra(const T& valor);

test2.cpp:

#include "tlib.h"
#include <iostream>

using namespace std;

int main (int argc, char const *argv[])
{ 
  double b = dobra<double>(10);
  cout << b << endl;
  return 0;
}

コンパイル中:

no25-89:CPROP canesin$ g++ -dynamiclib -Wall -std=c++11 tlib.cpp -o libdobra.so
no25-89:CPROP canesin$ g++ test2.cpp -Wall -std=c++11 -o test2 -L. -ldobra
Undefined symbols for architecture x86_64:
  "double dobra<double>(double const&)", referenced from:
      _main in cctLJGqf.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
no25-89:CPROP canesin$ 
4

1 に答える 1

2

C++ では、使用するすべてのコンパイル ユニットにテンプレートの完全な実装を含めるか、特定のインスタンスに限定する必要があります。

実際には、これは次のいずれかを意味します。

  1. tlib.cpp にあるものを tlib.h に入れます。これが最も一般的な解決策です。
  2. (たとえば) のみを使用するように制限しdobra<double>、明示的なインスタンス化を tlib.cpp に入れます。

    template double dobra<double>(const double& valor);

于 2012-06-23T02:07:44.967 に答える