在匿名实例创建中使用先前变量时重新声明错误

时间:2013-09-26 04:17:45

标签: c++ g++

在匿名实例创建中使用先前声明的变量时,g ++会给出重新声明错误。

我在" 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。结果是同样的错误。任何人都可以帮我理解这个问题吗?感谢。

2 个答案:

答案 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");
}

显然,这里对“类型(名称)”的处理是某种特殊情况,您可能希望通过编译器开发人员提出这一点。