参数列表不匹配的问题(隐蔽但罕见的错误原因)

在使用vs2022进行C++20编程时,作者遇到一个模板类构造函数的问题。尽管IDE没有显示语法错误,但在尝试使用某些构造函数时出现参数类型不匹配的错误。经过检查发现,一个构造函数的实现被意外复制,导致了其他构造函数的定义被屏蔽,进而影响了后续的函数调用。这个问题强调了细致检查和理解编译器行为的重要性。
摘要由CSDN通过智能技术生成

        先解释一下我遇到的问题,通过以下代码简化说明,IDE环境是vs2022,c++20:

template <typename T>
class C{
    public:
        T a;
        T b;
        T c;
    public:
        C();
        C(a);
        C(a,b);
        c(a,b,c);
};

这里给出了一个简单的模板类C,给出了四个构造函数,在外部写下了函数实现。,但是在实际使用的时候出现了一个很诡异的问题。

T t//这里指类型T的变量,并不是实际声明
C(t);//可以正常构造C
C(t,t);//不可以正常运行,红色下划线报参数类型不匹配错误
C(t,t,t);//不可以正常运行,红色下划线报参数类型不匹配错误

但是在模板类的函数声明和实现上在静态分析过程中并没有任何提示或错误警告出现,反复对照了参数表也没有问题。几经折腾之后,查找到问题如下:

template <typename T>
class C{
    public:
        T a;
        T b;
        T c;
    public:
        C();
        C(a);
        C(a,b);
        c(a,b,c);
};

template <typename T>
C<T>::C(a){...}
template <typename T>
C<T>::C(a){...}//问题在这里
template <typename T>
C<T>::C(a,b){...}
template <typename T>
C<T>::C(a,b,c){...}

在实现第一个有参构造为C(a)时,无意中把代码多复制了一份,但是编译器并没有给出任何的重定义报错,而是直接屏蔽了后面其他函数,导致了在使用第二三种有参构造时找不到参数列表的问题。目前暂不清楚非模板函数以及非成员函数在哪些情况下也不会报重定义错误,欢迎大家的讨论补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值