C++模板错误

问题描述:

我正在尝试一个简单的C++属性系统的实现,我发现它hereC++模板错误

但是代码不会编译。

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都不能编译它。有什么问题?

+0

Mi也不是,也不相关,风格注释:使用例如: 'operator ='''重置'你的代理而不是'operator()'。或者使用指定的成员(提供它也是常见的),例如'reset'通常用于智能指针。 –

的成员函数指针可以是一个模板参数,但在这种情况下,你不应该把typename前:

template <class T, class Object, T (Object::*real_getter)()> 

其他错误是呼叫:

(my_object->real_getter)() 

这应该是:

(my_object->*real_getter)() 
+0

啊,你可能会想要OP想要的! :-) –

+0

现货。谢谢! –

模板参数列表不起作用。模板参数必须是以下类型之一:类型名称,类型(带限制)或模板。

也许你的意思是有一个默认类型,像这样?

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 
{ //... 
}; 
+0

这些标准名称是* template非类型参数*(又名非类型参数),以及*模板类型参数*和*模板模板参数*。 (不要混淆:模板不是类型,但模板参数种类不重叠。) –

+0

非常好,谢谢你的澄清 - 那些确实是很酷的名字,而“template template argument”是我最喜欢的一天: - ) –