我在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 ) );
它工作正常。但现在我想将EqualByField1 typedef移动到结构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 :)
};
感谢名单。抱歉我丑陋的英语:)
答案 0 :(得分:2)
你的问题并不难看:-)
虽然我并非百分之百地确信这真的符合您的目标,但以下情况如下
解决方案可能会有所帮助:
struct S {
int field1;
template< class T >
struct TEqualByField1 {
typedef EqualBy< T, int, &T::field1 > type;
};
typedef TEqualByField1< S >::type EqualByField1;
};
希望这有帮助
答案 1 :(得分:1)
您的代码已经正确无误。至少你展示的部分。编译器认为&S::field1
是&(S::field1)
。但是你写的不是,因为它正确地希望有一个成员指针。
这似乎是编译器相关的问题。