相关疑难解决方法(0)

为什么"使用命名空间std"被认为是不好的做法?

我已经告诉别人,编写using namespace std;代码是错误的,我应该用std::coutstd::cin直接代替.

为什么被using namespace std;认为是不好的做法?是低效还是冒着声明模糊变量(与名称std空间中的函数具有相同名称的变量)的风险?它会影响性能吗?

c++ namespaces using-directives std c++-faq

2486
推荐指数
36
解决办法
78万
查看次数

C++令人困惑的成员模板的属性名称

我发现当v.foo从模板类型(T& v)的变量访问非模板属性()时,如果存在相同名称的模板函数(),可以欺骗C++认为它是成员模板template class <T> void foo().如何从C++规范中解释这一点?考虑这个简单的程序:

#include <cassert>

/** Determine whether the 'foo' attribute of an object is negative. */
template <class T>
bool foo_negative(T& v)
{
    return v.foo < 0;
}

struct X
{
    int foo;
};

int main()
{
    X x;
    x.foo = 5;
    assert(!foo_negative(x));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们有一个模板函数foo_negative,它接受任何类型的对象并确定其foo属性是否为负数.该main函数foo_negative用[T = X] 实例化.该程序编译并运行,没有任何输出.

现在,将此函数添加到程序的顶部:

template <class T>
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)

使用G ++ 4.6.3进行编译会导致此编译器错误:

funcs.cpp: In function …
Run Code Online (Sandbox Code Playgroud)

c++ templates

18
推荐指数
3
解决办法
3528
查看次数

标签 统计

c++ ×2

c++-faq ×1

namespaces ×1

std ×1

templates ×1

using-directives ×1