对模板使用显式,C++
using explicit with templates, C++
我有一个关于显式和模板的问题:
template<class T>
class A {
class A_Impl {
T var;
public:
explicit A_Impl(T var1) : var(var1), version(1)
{
}
A_Impl(const A_Impl& a ) : var(a.var), version(1)
{
}
const A_Impl& operator=(const A_Impl& a)
{
var=a.var;++version;return *this;
}
operator T() const { return var; }
friend class A<T>;
};
A_Impl a;
public:
A(T var): a(var)
{
}
A_Impl& get() { return a; }
};
void main() {
A<int> a1(5);
cout<<"a1 = "<<a1.get()<<endl;
a1.get()=7;
cout<<"a1 = "<<a1.get()<<endl;
a1=13;
cout<<"a1 = "<<a1.get()<<endl;
}
我在 a1.get()=7;
处收到 en 错误,说没有运算符"="与这些操作数匹配
另外,如果我把显式单词拿出来,它会编译,但我不明白a1.get()
函数和a1=13;
之间的区别,即使使用显式函数也能正常工作。
我在 a1.get()=7 处收到 en 错误;它说没有运算符"="与这些操作数匹配
没有办法将7
转换为operator=
的A_Impl
,因为构造函数A_Impl(T)
,在这种情况下扩展到A_Impl(int)
,被声明为explicit
。
您可以删除 explicit
关键字,也可以使用以下内容显式创建A_Impl
:
a1.get() = A_Impl(7);
或者,您也可以声明特定operator=
:
const A_Impl& operator=(const T&)
对于A_Impl
类。
另外,如果我把显式单词拿出来,它会编译,但我不明白 a1.get() 函数和 a1=13 之间的区别;即使使用显式也可以正常工作。
a1 = 13
工作正常,因为模板类A
有一个非显式构造函数来T
(特别是A(T var)
),在这种情况下,它非常适合T = int
。
另请注意,main
应始终返回 int
,而不是 void
。
您只声明了一个复制赋值运算符:const A_Impl& operator=(const A_Impl& a)
,但不是T
类型的赋值运算符:const A_Impl& operator=(const T& a)
.
如果你没有explicit
构造函数,你的int(7
)将完全转换为一个A_Impl
对象,然后分配给你返回的引用。
如果您的构造函数explicit
则不再可能进行这种完全转换(这就是explicit
实际所做的),因此不可能将int
分配给A_Impl
。但是,如果您的A_Impl
类是公共的,那么该怎么办(如果您不编写explicit
,则在引擎盖下发生的相同):
a1.get() = A_Impl(7);
- 没有找到相关文章