C ++模板:Byval / Reference干扰彼此

时间:2011-05-28 06:01:02

标签: c++ templates

这是我的问题的简化版本。我有一个属性类。它有像has_initalized这样的数据,我在这个例子中删除了这些数据。

当我调用一个使用T的函数时它很好。但是T&不是这样我决定写一个T&它的版本。但是这会导致使用plain T的所有函数都出现编译错误。为何T&干扰那个?对于此示例,如何在不更改main()的情况下使两个函数(Q和W)都可以工作?

template <class T>
class Property {
    T v;
    Property(Property&p) { }
public:
    Property() {}
    T operator=(T src) { v = src; return v; }
    operator T() const { return v; }
    operator T&() const{ return v; }
    T operator->() { return v; }
};

class A{};

void Q(A  s){}
void W(A& s){}

int main(){
    Property<A> a;
    Q(a);
    W(a);
}

2 个答案:

答案 0 :(得分:4)

C ++的重载规则中没有任何内容允许编译器在调用Q时在operatorT()operatorT&()之间进行选择。所以删除

operator T() const { return v; }

也将消除歧义。但是你会遇到问题,因为在const函数中返回一个非const引用是不可能的。

答案 1 :(得分:1)

对于Q,您可以使用这两种转换功能。您可以通过创建一个非const来使编译器优先于另一个。

operator T() const { return v; }
operator T&() { return v; }

现在Qoperator T&被采用。这种方式也将修复对W的调用以获得非const引用。您还可以从其他

返回const引用
operator T const&() const { return v; }
operator T&() { return v; }

这种方式仍然会更喜欢Q的第二个转换函数,但如果您的对象a是const并初始化const引用,则不需要始终复制v