このコードを検討してください:
#include <iostream>
#include <array>
template <typename Type>
struct Constant
{
constexpr Constant(const Type source) : _data({{source}}) {;}
constexpr Constant(const std::array<Type, 1> source) : _data(source) {;}
constexpr Constant<Type> operator()() const {return _data;}
constexpr operator Type() const {return _data[0];}
const std::array<Type, 1> _data;
static constexpr Constant<Type> pi = 3.1415926535897932384626433832795028841971693993751058209749445L;
};
int main(int argc, char* argv[])
{
std::cout<<Constant<double>::pi()<<std::endl;
return 0;
}
g++4.7.3
and (これは(フランス語で申し訳ありません)g++4.8.0
への未定義の参照です) でコンパイラ エラーが発生します。pi
/tmp/cctdvPfq.o: dans la fonction « main »:
main.cpp:(.text.startup+0xd): référence indéfinie vers « Constant<double>::pi »
collect2: erreur: ld a retourné 1 code d'état d'exécution
g++4.7.3
私のシステムは新規インストール (とを初めて使用g++4.8.0
) であるため、システム構成によるものなのか、コンパイラによるものなのかわかりません。コンパイラからのものである場合、どこに問題がありますか?
編集:なぜこれが機能しているのですか? (配列なしバージョン)
#include <iostream>
#include <array>
template <typename Type>
struct Constant
{
constexpr Constant(const Type source) : _data(source) {;}
constexpr Constant<Type> operator()() const {return _data;}
constexpr operator Type() const {return _data;}
const Type _data;
static constexpr Constant<Type> pi = 3.1415926535897932384626433832795028841971693993751058209749445L;
};
int main(int argc, char* argv[])
{
std::cout<<Constant<double>::pi()<<std::endl;
return 0;
}