C++ BOOST_STRONG_TYPEDEF和重载关系运算符

C++ BOOST_STRONG_TYPEDEF和重载关系运算符,c++,boost,types,operator-overloading,typedef,C++,Boost,Types,Operator Overloading,Typedef,我使用BOOST_STRONG_TYPEDEF从POD类型定义强类型。例如,我想从int定义一个新类型。但是,如果我尝试将我的新类型与非int(例如unsigned int,size\u t)的类型进行比较,我会得到“使用重载运算符” 由于BOOST_STRONG_TYPEDEF提供了从Foo到int的转换运算符,我本以为(unsigned int)会编译成与(unsigned int)相同的东西,但我想不会 BOOST\u STRONG\u TYPEDEF宏定义了一个继承自一组不同运算符类的s

我使用BOOST_STRONG_TYPEDEF从POD类型定义强类型。例如,我想从
int
定义一个新类型。但是,如果我尝试将我的新类型与非
int
(例如
unsigned int
size\u t
)的类型进行比较,我会得到“使用重载运算符” 由于BOOST_STRONG_TYPEDEF提供了从
Foo
int
的转换运算符,我本以为
(unsigned int)
会编译成与
(unsigned int)
相同的东西,但我想不会

BOOST\u STRONG\u TYPEDEF
宏定义了一个继承自一组不同运算符类的
struct Foo
,其中一个将定义:

friend bool operator<(const int&, const Foo&); //(1)

对于秩等于
int
的整数类型,
(1)
仍然是首选。但对于所有其他整数类型,模板将是完全匹配的,而内置和
(1)
涉及一些转换序列,因此这将是首选-这将转发到一个不明确的内置项。

非常有用的答案,谢谢。有没有理由更喜欢模板函数中的静态转换而不是直接访问Foo的t成员变量?
bool operator<(const size_t& y, const Foo& x) {
    return y < x.t;
}
friend bool operator<(const int&, const Foo&); //(1)
bool operator<(T, U); // (2), implicit
template <typename T>
bool operator<(const T& t, const Foo& f)
{
    return t < static_cast<int>(f);
}