全て。
次のように一連の c++ コードを作成しました。次に、それぞれをg ++で
コンパイルしましたが、成功しました。
ただし、リンケージエラーが発生しました.cpp
.o
Undefined symbols for architecture x86_64:
"derive1<3>::derive1(int)", referenced from:
derive2::derive2(int)in derive2.o
derive2::derive2(int)in derive2.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
何が起こっているのか教えていただけますか?すべてのコード スニペットを 1 つのファイルにバインドすると、エラーは発生せず、意図したとおりに完全に機能します。extern キーワードをどこかに導入する必要があると思いますが、その方法がわかりません。
私のコンパイラは
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Apple Inc. ビルド 5658 に基づく) (LLVM ビルド 2336.11.00)
「base.hpp」
class base {
public:
virtual int hoge( int num ) = 0;
};
「derive1.hpp」
#include "base.hpp"
#include <iostream>
template <int N>
class derive1 : public base {
public:
explicit derive1( int n );
virtual int hoge( int num ) {
std::cout << "num = " << num << std::endl
<< "N = " << N << std::endl;
return N;
}
};
「derive1.cpp」
#include "derive1.hpp"
template <int N>
derive1<N>::derive1 ( int n ) {
std::cout << "This is the constructer of derive1" << std::endl
<< "N = " << N << ", n = " << n << std::endl;
}
「derive2.hpp」
#include "derive1.hpp"
#include <iostream>
class derive2 : public derive1<3> {
public:
explicit derive2( int n );
};
「derive2.cpp」
#include "derive2.hpp"
derive2::derive2( int n ) : derive1<3>( n ) {
std::cout << "This is the constructer of derive2" << std::endl
<< "n = " << n << std::endl;
}
"derive_test.cpp"
#include<iostream>
#include "derive2.hpp"
int main() {
derive2 test(3);
std::cout << "return value = "
<< test.hoge( 5 )
<< std::endl;
return 0;
}