C++ C++;模板:Byval/引用相互干扰

C++ C++;模板:Byval/引用相互干扰,c++,templates,C++,Templates,这是我问题的简化版本。我有一个属性类。它有像has_initialized这样的数据,我在本例中删除了这些数据 当我调用一个使用T的函数时,它很好。但是T&Is不是,所以我决定写一个T&version。但这会导致所有使用普通T的函数都会出现编译错误。为什么T&要干预这一点?对于本例,如何在不更改main()的情况下使这两个函数(Q和W)都工作 模板 类属性{ 电视 物业(物业及物业管理){} 公众: 属性(){} T运算符=(tsrc){v=src;返回v;} 运算符T()常量{return v

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

当我调用一个使用T的函数时,它很好。但是T&Is不是,所以我决定写一个T&version。但这会导致所有使用普通T的函数都会出现编译错误。为什么T&要干预这一点?对于本例,如何在不更改main()的情况下使这两个函数(Q和W)都工作

模板
类属性{
电视
物业(物业及物业管理){}
公众:
属性(){}
T运算符=(tsrc){v=src;返回v;}
运算符T()常量{return v;}
运算符T&()常量{return v;}
T运算符->(){return v;}
};
A类{};
void Q(as){}
void W(A&s){}
int main(){
财产a;
Q(a);
W(a);
}

在C++的重载规则中,没有任何编译器允许编译器在调用q.>代码>和<代码>操作程序>和()< />代码中调用Q。
operator T() const { return v; }

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

在C++的重载规则中没有任何东西允许编译器在调用q> >代码>和<代码>操作符>和()< />代码中调用Q。
operator T() const { return v; }

也将消除歧义。但是您将遇到一个问题,因为在常量函数中不可能返回对成员的非常量引用。

对于
Q
,您可以同时使用这两个转换函数。通过使一个非常量,可以使编译器更喜欢其中一个

operator T() const { return v; }
operator T&() { return v; }
现在对于
Q
,使用
操作符T&
。这种方法还将修复对
W
的调用,以获取非常量引用。您还可以从另一个数据库返回常量引用

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

通过这种方式,
Q
仍然需要使用第二个转换函数,但如果对象
a
是常量,并且您初始化了常量引用,则不一定需要复制
v

对于您的
Q
,您可以使用这两种转换函数。通过使一个非常量,可以使编译器更喜欢其中一个

operator T() const { return v; }
operator T&() { return v; }
现在对于
Q
,使用
操作符T&
。这种方法还将修复对
W
的调用,以获取非常量引用。您还可以从另一个数据库返回常量引用

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

通过这种方式,
Q
仍然需要使用第二个转换函数,但如果对象
a
是常量,并且您初始化了常量引用,则不一定需要复制
v

说真的,我不能理解这个问题和问题。@Nawaz:试着编译它-1告诉我要
试着编译它
。我为什么要这样做?你不能自己告诉我们错误和问题吗?这段代码的意义是什么?你为什么要写这篇文章?说真的,我不明白这个问题和问题所在。@Nawaz:试着编译它-1告诉我要
试着编译它
。我为什么要这样做?你不能自己告诉我们错误和问题吗?这段代码的意义是什么?你为什么要先写这个?