用不同类型重新定义变量

redefinition of a variable with a different type

本文关键字:定义 变量 新定义 同类型      更新时间:2023-10-16

很抱歉问题的标题,但我不知道问题的正确标题。我有以下代码示例:

struct test {
test(int a) {
}
};
int main() {
test(1);
return 0;
}

上面的示例代码是有效的。现在我(在我的理解中(做同样的事情有点不同:

struct test {
test(int a) {
}
};
int main() {
int a = 0;
test(a);
return 0;
}

当我编译这个时,我得到以下错误:

error: redefinition of 'a' with a different type: 'test' vs 'int'

但在我看来,当我尝试这个时,它变得非常奇怪:

struct test {
test(int a) {
}
};
int main() {
int a = 0;
test((int)a);
return 0;
}

上面的例子又起作用了,真的让我很困惑,因为我看不到区别(除了将int转换为int(。有人能解释一下发生了什么吗?提前谢谢。

您忘记为test变量命名,导致test(a);test类型的名为a的变量的声明。

在其他情况下,由于test(1)test((int)a)不能是声明,而必须是某种调用,因此编译器会将其视为构造一个没有名称的test类型的临时对象。

这真的很棘手:

test(1);

这是参数为1的test的构造。

int a = 1;
test(a);

编译器将其读取为test a;(名为a–的test实例,具有默认构造(。test甚至不提供默认的构造函数,编译器在这一点上并没有考虑到这一点。

修复(由OP找到(:

int a = 1;
test((int)a);

现在,编译器被明确告知将a读取为表达式(但不读取为标识符(。

在C++中定义变量的语法有点古怪。。。

当你做

test(1);

创建test结构的临时对象。此对象将立即被销毁。

但当你做时

test(a);

您并没有创建一个临时的test对象,而是实际定义了一个名为a的变量。它相当于

test a;

你可以通过使用花括号来解决这个问题

test{a};

或者通过对"参数"使用显式表达式(就像对类型转换所做的那样(,因此不能用作变量名。在需要消除变量和表达式之间歧义的类似情况下,通常使用中的一元+

test(+a);

ISO C++标准(ISO/IEC 14882(2003中,在3.2部分:

在任何翻译单元中,一个模板、类型、函数或对象只能有一个定义

请注意一定义规则(ODR(是C++编程语言中的一个重要概念。

如果您希望有许多具有相同名称的函数(当然还有不同签名(,那么函数重载就是您想要的功能。