这个C ++模板声明是否真的不正确或者我的编译器正在崩溃?

时间:2017-04-05 20:03:10

标签: c++

编辑:谢谢你的回答!就像我说的,这是为类提供的代码,因此包含了函数的名称空间和名称。我很高兴能够理解命名空间std究竟是什么,并且我已将我的输入作为评论包含在我的答案中(尽管我的答案保持不变)。

以下代码包含我创建的作品。这是一个类,所以这是我需要判断的唯一部分。我的编译器没有运行(对重载函数的模糊调用),但我觉得这是正确的。

template <class data_type>
void swap(data_type &a, data_type &b) //swaps 2 variables
{
   data_type c; //temp variable
   c = a;
   a = b;
   b = c;
}

以下是完整代码:

#include <iostream>
#include <string>

using namespace std;

template <class data_type>
void swap(data_type &a, data_type &b) //swaps variables
{
   data_type c;
   c = a;
   a = b;
   b = c;
}

int main( )
{
    string x = "first", y = "second";
    int m = 10, n = 20;
    char q = 'Q', r = 'R';

    cout<<"x before swap called = "<<x<<" and y before swap called = "
<<y<<endl;
    swap(x,y);
    cout<<"x after swap called = "<<x<<" and y after swap called = "
<<y<<endl<<endl;

    cout<<"m before swap called = "<<m<<" and n before swap called = "
<<n<<endl;
    swap(m,n);
    cout<<"m after swap called = "<<m<<" and n after swap called = "
<<n<<endl<<endl;

    cout<<"q before swap called = "<<q<<" and r before swap called = "  
<<r<<endl;
    swap(q,r);
    cout<<"q after swap called = "<<q<<" and r after swap called = "   
<<r<<endl<<endl;

    return 0;
}

3 个答案:

答案 0 :(得分:6)

标准库附带了一个模板std::swap(请参阅cpp reference),您正在定义自己的swap - 模板功能。到目前为止没问题,但是一旦你声明using namespace stdswap的任何使用都是不明确的,因为编译器无法决定是采用std::swap还是你自己swap

因此,正如其他人已经提到的那样,请避免使用using namespace std声明。

此外,您可以考虑宣布&#34;您的&#34; swap在自己的命名空间中,例如:

namespace class1_exercise {

    template <class data_type>
    void swap(data_type &a, data_type &b) //swaps variables
    {
        data_type c;
        c = a;
        a = b;
        b = c;
    }
}

因此,您可以区分&#34;您的&#34; swap和std :: swap更加明确:

std::swap(x,y);
// versus:
class1_exercise::swap(x,y);

答案 1 :(得分:4)

是你。

//using namespace std;
using std::string;
using std::cout;
using std::endl;

答案 2 :(得分:2)

这是错误的原因

using namespace std;

使用命名空间std&#34; 声明&#34;真的非常糟糕的做法 使用命名空间会引入您不想要的内容

有两种替代解决方案

ONE

using std::cout; 
cout << "Values:";

两个(我建议这个)

std::cout << "Values:";

注意:您可以更改交换功能的名称,但最好更好地适应更好的方式,以便将来遇到更少的问题