C++模板错误
我正在尝试一个简单的C++属性系统的实现,我发现它here。C++模板错误
但是代码不会编译。
template <class T, class Object, typename T (Object::*real_getter)()>
class ReadOnlyProperty
{
Object * my_object;
public:
void operator() (Object * obj)
{
my_object = obj;
}
T operator()() const
{
return (my_object->real_getter)();
}
T get() const
{
return (my_object->real_getter)();
}
void set(T const & value);
operator T() const {
return (my_object->*real_getter)();
}
typedef T value_type;
};
我在第一行得到多个错误。我使用的是Xcode 4,LLVM 2.1或GCC 4.2都不能编译它。有什么问题?
的成员函数指针可以是一个模板参数,但在这种情况下,你不应该把typename
前:
template <class T, class Object, T (Object::*real_getter)()>
其他错误是呼叫:
(my_object->real_getter)()
这应该是:
(my_object->*real_getter)()
啊,你可能会想要OP想要的! :-) –
现货。谢谢! –
模板参数列表不起作用。模板参数必须是以下类型之一:类型名称,类型(带限制)或模板。
也许你的意思是有一个默认类型,像这样?
template <class T,
class Object,
typename U = T (Object::*real_getter)()>
class ...
这里U
默认为指针到成员函数,但你必须提供包括返回类型的完整签名。
还是你的意思是real_getter
要成为typedef?
template <class T, class Object>
class ReadOnlyProperty
{
typedef typename T (Object::*real_getter)();
//...
};
或者作为@jmihalicza建议,你要T (Object::*)()
类型的值参数?
template <class T, class Object, T (Object::*real_getter)()>
class ReadOnlyProperty
{ //...
};
这些标准名称是* template非类型参数*(又名非类型参数),以及*模板类型参数*和*模板模板参数*。 (不要混淆:模板不是类型,但模板参数种类不重叠。) –
非常好,谢谢你的澄清 - 那些确实是很酷的名字,而“template template argument”是我最喜欢的一天: - ) –
Mi也不是,也不相关,风格注释:使用例如: 'operator ='''重置'你的代理而不是'operator()'。或者使用指定的成员(提供它也是常见的),例如'reset'通常用于智能指针。 –