次のコードは、Def::DEFAULT; への未定義の参照でコンパイルに失敗するという、私が遭遇した問題を示しています。
ただし、メインの 2 行目をコメント アウトすると、コンパイルして正常に実行されます。int にキャストするか、Val クラスの int データ メンバーに直接割り当てることで、DEFAULT に割り当てられた値を「見る」ことができます。
template <typename T, T def>
class Def {
public:
static const T DEFAULT = def;
enum {DEFAULT_ENUM = DEFAULT};
};
class Val {
public:
Val& operator=(const int &val_in) {
val = val_in;
return *this;
}
int val;
};
typedef Def<int, 10> Def_t;
Val test_val;
int main()
{
test_val = Def_t::DEFAULT_ENUM; // works
test_val = Def_t::DEFAULT; // fails to compile
test_val = (int) Def_t::DEFAULT; // works
test_val.val = Def_t::DEFAULT; // works
}