ローカル関数をシミュレートする方法としてローカルクラスを使用しようとしていました。ローカルクラスは、いくつかの静的ヘルパー関数を定義しています。各静的関数は、関数スコープで定義された静的配列にアクセスする必要があります。事は正常な機能のために働いていますが、私はテンプレート関数を使用するときにリンクエラーがあります。コードは次のとおりです。ローカルクラスと関数テンプレート
#include <iostream>
double test_local (double x)
{
static const double coeff[3]={ 0, 1, 2 };
struct local_functions
{
static double f0 (double x)
{
static const double c0=coeff[0]+coeff[1];
return c0+x;
}
static double f1 (double x)
{
static const double c1=coeff[1]+coeff[2];
return c1+x;
}
static double f2 (double x)
{
static const double c2=coeff[2]+coeff[0];
return c2+x;
}
};
return local_functions::f0(x)+local_functions::f1(x)+local_functions::f2(x);
}
template<class t>
t test_local_tmpl (t x)
{
static const t coeff[3]={ 0, 1, 2 };
struct local_functions
{
static t f0 (double x)
{
static const t c0=coeff[0]+coeff[1];
return c0+x;
}
static t f1 (t x)
{
static const t c1=coeff[1]+coeff[2];
return c1+x;
}
static t f2 (t x)
{
static const t c2=coeff[2]+coeff[0];
return c2+x;
}
};
return local_functions::f0(x)+local_functions::f1(x)+local_functions::f2(x);
}
int main (int argc, char** argv)
{
double result=test_local (1e0);
// uncommenting next line generates a linking error
// double result_tmpl=test_local_tmpl (1e0);
std::cout << result << std::endl;
return 0;
}
非テンプレート関数が正常に動作します(それは9を印刷します)、私はテンプレートのバージョンを起動しようとすると、それは罰金コンパイルするが、G ++の下にリンクしませんが - 4.6:
g++ -c -g local_class.cpp && g++ local_class.o -o local_class
Undefined symbols:
"coeff", referenced from:
double test_local_tmpl<double>(double)::local_functions::f2(double) in local_class.o
double test_local_tmpl<double>(double)::local_functions::f2(double) in local_class.o
double test_local_tmpl<double>(double)::local_functions::f1(double) in local_class.o
double test_local_tmpl<double>(double)::local_functions::f1(double) in local_class.o
double test_local_tmpl<double>(double)::local_functions::f0(double) in local_class.o
double test_local_tmpl<double>(double)::local_functions::f0(double) in local_class.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
これは予想されるbeahaviourですか、私は何か、または何が欠けているのですか?
[STLアルゴリズムでのローカルクラスの使用](http://stackoverflow.com/questions/742607/using-local-classes-with-stl-algorithms)の可能な複製。テンプレート内のローカルクラスを使用しないという制限はC++ 11から削除されましたが、gcc4.6がそれを実装しているかどうかわかりません - もう一度考えれば、重複しているとは確信していません。そのように配置されたコードで質問を処理します。 –
ひどい書式設定です。 – Nawaz
@DavidRodríguez-dribeas:リンク時に問題があります。**コードはうまくコンパイルされます**。いずれにしても、-std = C++ 0xフラグを追加すると同じ問題が発生します。 – Giuliano