我在" weird.cpp"中有以下代码:源文件:
#include <iostream>
int main()
{
int i = 0;
int j = int ( i );
int ( i );
}
我得到的错误是,
weird.cpp: In function ‘int main()’:
weird.cpp:7: error: redeclaration of ‘int i’
weird.cpp:5: error: ‘int i’ previously declared here
我在mac和linux上分别用版本4.2和4.7试过这个。我也尝试过使用其他类型而不是int。结果是同样的错误。任何人都可以帮我理解这个问题吗?感谢。
答案 0 :(得分:2)
首先,你在这里使用的括号没有做任何事情。
int i = 0;
int j = int(i); // This is casting i to an int. It's already an int.
int j = i; // This does the same as the last line.
int (i); // This is redeclaring an int named i, which had already been done.
int i; // This is the same as the last line.
对于在其构造函数中接受int
的对象所说的内容没有意义。
struct A { A(int) {} };
int i;
A obj(i); // A instance named obj which takes integer i as constructor argument.
我真的不明白你在这里想要达到的目标,也许是这个?
int i = 0;
int j = i;
{
int i; // In another scope, shadowing the first i for scope duration.
}
答案 1 :(得分:2)
你可能会因此而感到困惑,这是C ++的上下文敏感性以及编译器如何解释它的情况。
int (i);
被视为“i”的声明(因为你已经在这个范围内有一个名为i的变量并且没有启用-Wno-shadow,所以它不允许这样做。)
对比以下不编译的情况:(见http://ideone.com/QuwnTC)
#include <iostream>
class Bark {
public:
Bark(const char* msg, const char*) {
std::cout << "Hear ye, hear ye. " << msg << std::endl;
}
};
void bark(const char* i) {
Bark (i); // error here.
}
int main(int argc, const char* argv) {
bark("wtf");
}
它抱怨Bark(i)影响了“我的声明。”
但是,以下两个DO编译:http://ideone.com/dcGMET
void bark(const char* i) {
Bark (i + 1);
}
或在括号内有两个参数:(http://ideone.com/tMzSY9)
#include <iostream>
class Bark {
public:
Bark(const char* msg, const char*) {
std::cout << "Hear ye, hear ye. " << msg << std::endl;
}
};
void bark(const char* i) {
Bark (i, NULL);
}
int main(int argc, const char* argv) {
bark("wtf");
}
显然,这里对“类型(名称)”的处理是某种特殊情况,您可能希望通过编译器开发人员提出这一点。