У меня есть код в MSVC 2008:
template< class T, class FieldType, FieldType T::*FieldPtr >
struct EqualBy {
EqualBy( const FieldType & value ) : m_filedValue( value ) {}
bool operator()( const T & r ) const {
return m_filedValue == r.*FieldPtr;
}
private:
const FieldType m_filedValue;
};
...
struct S {
int field1;
...
};
typedef EqualBy< S, int, &S::field1 > EqualByField1;
...
typedef std::vector< S > SVect;
SVect v;
SVect::const_iterator found = std::find_if( v.begin(), v.end(), EqualByField1( 42 ) );
, он отлично работает.Но теперь я хочу переместить typedef типа EqualByField1 в struct S. как этот
struct S {
int field1;
...
typedef EqualBy< S, int, &S::field1 > EqualByField1;
};
, чтобы уменьшить область действия этого typedef и «украсить» код вызывающего абонента следующим образом
SVect::const_iterator found = std::find_if( v.begin(), v.end(), S::EqualByField1( 42 ) );
но я получил следующие ошибки
ошибка C2327: 'S :: field1': не является именем типа, статическим или перечислителем
ошибка C2065: 'field1': необъявленный идентификатор
Вопрос в том, существует ли какое-либо решение этой проблемы, кроме как для получения из S подобного
struct SS : public S {
typedef EqualBy< S, int, &S::field1 > EqualByField1; // it works, but I do not want to derive :)
};
Спасибо.И извините за мой уродливый английский:)