もっと言えば、このコードの問題点は次のとおりです。
#include <assert.h>
#include <functional>
using namespace std;
template< class BaseObjectId >
class Check
{
protected:
Check( function<bool()> const f ) { assert( f() ); }
};
template< int tpMinValue, int tpMaxValue >
class IntegerSubrange
: private Check< IntegerSubrange< tpMinValue, tpMaxValue > >
{
private:
int value_;
public:
enum :int { minValue = tpMinValue, maxValue = tpMaxValue };
static bool rangeContains( int const x )
{
return (minValue <= x && x <= maxValue);
}
operator int() const
{
return value_;
}
void operator/=( int const rhs )
{
value_ /= rhs;
assert( rangeContains( value_ ) );
}
explicit IntegerSubrange( int const value )
: Check< IntegerSubrange< tpMinValue, tpMaxValue > >(
[=]() -> bool { return rangeContains( value ); }
)
, value_( value )
{}
};
int main() {}
Visual C++ は構文エラーを報告します:
foo.cpp foo.cpp(41): エラー C2059: 構文エラー: ')' foo.cpp(44) : コンパイル中のクラス テンプレートのインスタンス化 'IntegerSubrange' への参照を参照してください foo.cpp(42): エラー C2059: 構文エラー: ',' foo.cpp(43): エラー C2334: '{' の前に予期しないトークンがあります。見かけの関数本体をスキップする