显然C ++允许你定义一个结构/类和一个具有相同名称的函数,如下所示:
struct Foo {
int foo;
Foo(int foo) : foo(foo) {}
};
void Foo(int foo) {}
int main() {
// Works, calls function
Foo(42);
// Doesn't work - compiler error
Foo foo(42);
}
这是预期的行为吗? 如何创建Foo结构的实例? 如何避免在项目中定义名为类型的函数的某个添加库导致编译器错误到处?
答案 0 :(得分:4)
当您指的是类型时,您可以写struct
或class
:
struct Foo foo(42);
class Foo bar(0xdeadbeef);
答案 1 :(得分:3)
是的,这是预料之中的。没有一般的说法“我的意思是类,而不是函数,用这个名字”,因为你不应该重用名字。
typename
在这里无法帮助您,但由于Foo
是一个类而且C ++提供了与C的struct T
类型语法的向后兼容性,因此您可以说class Foo
或{{1而是:
struct Foo
这是一种黑客行为,并没有真正解决根本问题,即程序中的符号没有明确区分彼此。
根据您的实际情况,命名空间可能会以强大的清除方式解决您的问题。库应使用它们(但通常不会)。
否则只需改善您的姓名......我的意思并不是要拨打一个int main() {
// Calls function
Foo(42);
// Constructs a `[class] Foo`
class Foo foo(42);
}
而另一个Foo
!