【问题标题】:Why do I get a template error if I name my function `swap`, but `Swap` is okay?如果我将函数命名为 `swap`,为什么会出现模板错误,但 `Swap` 没问题?
【发布时间】:2012-11-10 15:59:49
【问题描述】:

好的,程序就到这里了,绝对正确

#include <iostream>

using namespace std;

template <typename T>
void Swap(T &a , T &b);

int main(){

    int i = 10;
    int j = 20;

    cout<<"i, j = " << i <<" , " <<j<<endl;
    Swap(i,j);
    cout<<"i, j = " << i <<" , " <<j<<endl;


}
template <typename T>
void Swap(T &a , T &b){
    T temp;
    temp = a ;
    a = b;
    b= temp;
}

但是当我将函数的名称从 Swap 更改为 swap 它会产生一个错误提示

错误:重载“swap(int&, int&)”的调用不明确|笔记: 候选者是: void swap(T&, T&) [with T = int]| ||=== 构建 已完成:1 个错误,0 个警告 ===|

发生了什么是使用模板开始函数以大写字母开头的规则吗?

【问题讨论】:

  • 谁/在哪里建议模板化的函数名称应该以大写字母开头?我问是因为我不知道,不是因为我不同意。虽然,例如标准库也使用小写命名约定,所以快速思考我无法为这种命名方案提供很大的好处。 :)

标签: c++ templates


【解决方案1】:

这是因为已经存在一个名为swap 的函数。它实际上在std 命名空间下,但是因为你有一个using namespace std 行,所以它存在时没有std:: 前缀。

如您所见,使用using namespace std 并不总是一个好的选择,因为可能会出现名称冲突,如本例所示。一般来说,人们不应该使用using 指令,除非有真正的原因——命名空间的存在是有原因的——以防止名称冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多