#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
using namespace boost;
struct Serializable{};
struct Derived : Serializable {};
class Serializer
{
public:
template <typename ValueType>
void operator& (const typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type& value) {
;
}
};
int main() {
Serializer serializer;
Derived tar;
serializer & tar;
return 0;
}
我使用的是g ++ 4.4.7,它给了我一个编译错误: 错误:与'serializer&amp;'中的'operator&amp;'不匹配焦油”
如何进行专业化?
答案 0 :(得分:1)
operator &
的右侧值应为ValueType
类型。因此,将enable_if
部分设为(假)结果类型:
#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
using namespace boost;
struct Serializable{};
struct Derived : Serializable {};
class Serializer
{
public:
template <typename ValueType>
const typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type* operator& (ValueType &v)
{
return 0;
}
};
int main()
{
Serializer serializer;
Derived tar;
int i = 1;
serializer & tar; //ok
serializer & i; //error
return 0;
}
在C ++ 11中,您还可以使enable_if
构造一个默认的模板参数,这将使函数签名保持干净且未经修改:
template <typename ValueType, typename = typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type>
void operator& (ValueType &v)
{
}