C++ 我正在尝试使用c++; #包括 使用名称空间std; 模板 无效掉期(T&i、T&j) { 温度T=i; i=j; j=温度; } int main() { int m=5,n=10; 你的问题是什么

C++ 我正在尝试使用c++; #包括 使用名称空间std; 模板 无效掉期(T&i、T&j) { 温度T=i; i=j; j=温度; } int main() { int m=5,n=10; 你的问题是什么,c++,C++,这是一个完美的例子,说明了为什么“使用namespace std;”会在最不经意的时候以误导和混淆的错误消息将您搞砸 从代码中删除“使用命名空间std”,并在需要时始终明确指定“std”,即std::cin,std::cout,等等 你需要保证你永远不会再写“使用命名空间STD”。完全忘记这是C++语言的一部分。 程序的固定版本(编译时没有任何问题)是: #include <iostream> using namespace std; template <typename T&

这是一个完美的例子,说明了为什么“使用namespace std;”会在最不经意的时候以误导和混淆的错误消息将您搞砸

从代码中删除“使用命名空间std”,并在需要时始终明确指定“std”,即
std::cin
std::cout
,等等

<>你需要保证你永远不会再写“使用命名空间STD”。完全忘记这是C++语言的一部分。

程序的固定版本(编译时没有任何问题)是:

#include <iostream>
using namespace std;
template <typename T>
void swap(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}
int main()
{
    int m = 5, n = 10;
    cout << "Inputs: " << m << "," << n << endl;
    swap(m, n);
    cout << "Outputs: " << m << "," << n << endl;
    return 0;
}
#包括
模板
无效掉期(T&i、T&j)
{
温度T=i;
i=j;
j=温度;
}
int main()
{
int m=5,n=10;
你的问题是

这是一个完美的例子,说明了为什么“使用namespace std;”会在最不经意的时候以误导和混淆的错误消息将您搞砸

从代码中删除“使用命名空间std”,并在需要时始终明确指定“std”,即
std::cin
std::cout
,等等

<>你需要保证你永远不会再写“使用命名空间STD”。完全忘记这是C++语言的一部分。

程序的固定版本(编译时没有任何问题)是:

#include <iostream>
using namespace std;
template <typename T>
void swap(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}
int main()
{
    int m = 5, n = 10;
    cout << "Inputs: " << m << "," << n << endl;
    swap(m, n);
    cout << "Outputs: " << m << "," << n << endl;
    return 0;
}
#包括
模板
无效掉期(T&i、T&j)
{
温度T=i;
i=j;
j=温度;
}
int main()
{
int m=5,n=10;
std::coutswap()已经是std命名空间中定义的函数。请将您的方法重命名为其他方法

#include <iostream>

template <typename T>
void swap(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}
int main()
{
    int m = 5, n = 10;
    std::cout << "Inputs: " << m << "," << n << std::endl;
    swap(m, n);
    std::cout << "Outputs: " << m << "," << n << std::endl;
    return 0;
}
使用名称空间std;
模板
真空抽汲器(T&i、T&j)
{
温度T=i;
i=j;
j=温度;
}
int main()
{
int m=5,n=10;
coutswap()已经是std命名空间中定义的函数。请将您的方法重命名为其他方法

#include <iostream>

template <typename T>
void swap(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}
int main()
{
    int m = 5, n = 10;
    std::cout << "Inputs: " << m << "," << n << std::endl;
    swap(m, n);
    std::cout << "Outputs: " << m << "," << n << std::endl;
    return 0;
}
使用名称空间std;
模板
真空抽汲器(T&i、T&j)
{
温度T=i;
i=j;
j=温度;
}
int main()
{
int m=5,n=10;

cout错误消息清楚地表明:
错误:对“swap”的调用不明确

这是因为
swap
名称空间std
的一部分
而且,由于您使用的是命名空间std;
,这是不明确的

您可以通过以下方式解决此问题:

1.使用命名空间std删除行


2.将模板函数重命名为其他函数

错误消息清楚地显示:
错误:调用“swap”不明确

这是因为
swap
名称空间std
的一部分
而且,由于您使用的是命名空间std;
,这是不明确的

您可以通过以下方式解决此问题:

1.使用命名空间std删除行


2.将模板函数重命名为其他函数

实际上,您的代码中有许多问题会导致错误消息。并且,由于您的实现(即您正在使用的标准库),导致该问题的原因有一个

首先,您定义了一个模板化的
swap()
,其形式与名为
swap()
的现有函数相同(通过引用接受两个相同类型的对象)

其次,使用命名空间std的
告诉编译器命名空间
std
中的名称是匹配代码中名称的候选名称。因此,当编译器看到您的代码
交换(m,n)
其中
m
n
int
时,它会同时看到您的定义和命名空间
std
中的定义(即,
std::swap()
作为可行的候选者,以匹配代码中的名称
swap()
。两个候选者都能够接受两个类型为(引用)
int
的参数,因此编译器没有理由选择一个参数而不是另一个参数。因此,编译器拒绝您的代码时会显示一条关于歧义的错误消息

第三个问题是在您的实现中(即您的编译器及其关联的标准库)
显然已经在
std::swap()
的定义中引入了。问题是
也不需要这样做(即,如果您使用不同的编译器构建代码,您不能指望它发生)也不要求不这样做(即,您的代码可以使用某些编译器/库进行编译,但其他编译器/库不会)

实际上,标准要求在
中声明
std::swap()
,而不是在
中声明

因此,让代码与所有编译器一起工作的选项很简单。第一个选项是根本不定义自己的
swap()
,而是依赖标准库

using namespace std;
template <typename T>
void swaper(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}
int main()
{
    int m = 5, n = 10;
    cout << "Inputs: " << m << "," << n << endl;
    swaper(m, n);
    cout << "Outputs: " << m << "," << n << endl;
    return 0;
}
第三个选项是使用命名空间std从代码中删除
。这将允许您安全地声明自己的
swap()
,而不会与
std::swap()
冲突


我对该选项的偏好的简短解释是,它还避免了其他各种歧义问题。保存的不必在名称上添加前缀的键入
std::
,不值得在出现其他歧义问题时带来麻烦。

实际上,您的代码中有许多问题会导致错误消息由于您的实现(即您正在使用的标准库),导致问题的原因之一是ge

首先,您定义了一个模板化的
swap()
,其形式与名为
swap()
的现有函数相同(通过引用接受两个相同类型的对象)

其次,
使用名称空间std
告诉编译器名称空间
std
中的名称是匹配代码中名称的候选名称。因此,当编译器看到您的代码
交换(m,n)
其中
m
n
int
时,它会同时看到您的定义和名称空间
std中的定义
#include <iostream>
#include <algorithm>

template <typename T>
void swap(T& i, T& j)
{
    T temp = i;
    i = j;
    j = temp;
}

int main()
{
    int m = 5, n = 10;
    std::cout << "Inputs: " << m << "," << n << std::endl;
    swap(m, n);
    std::cout << "Outputs: " << m << "," << n << std::endl;
    return 0;
}
#include <iostream>
#include <algorithm>   //   Needed to guarantee visibility of std::swap()

int main()
{
    int m = 5, n = 10;
    std::cout << "Inputs: " << m << "," << n << std::endl;
    std::swap(m, n);
    std::cout << "Outputs: " << m << "," << n << std::endl;
    return 0;
}