больше до точки, что не так с этим кодом:, какие идентификаторы доступны для лямбда в списке инициализации конструктора
#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) : error C2059: syntax error : ')' foo.cpp(44) : see reference to class template instantiation 'IntegerSubrange' being compiled foo.cpp(42) : error C2059: syntax error : ',' foo.cpp(43) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
компилирует хорошо с г ++ 4.6.3 –
ах, мне нужно обновить г ++ то. Я также проверю с помощью Visual C++ 11! ** Он компилируется с Visual C++ 11 **, я бы не поверил –
@Griwes: g ++ 4.6.3 новее 4.6.1, а 4.6.1 компилирует lambdas просто отлично. –