对模板使用显式,C++

using explicit with templates, C++

本文关键字:C++      更新时间:2023-10-16

我有一个关于显式和模板的问题:

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);
相关文章:
  • 没有找到相关文章