用不同类型重新定义变量
redefinition of a variable with a different type
很抱歉问题的标题,但我不知道问题的正确标题。我有以下代码示例:
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++编程语言中的一个重要概念。
如果您希望有许多具有相同名称的函数(当然还有不同签名(,那么函数重载就是您想要的功能。
- 在头文件中定义变量不会出错
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 在命名空间中定义变量
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用不同类型重新定义变量
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 定义变量类型
- 在命名空间中定义变量,但在测试中获取空值
- cmake没有定义变量
- C 中的继承:在亲子类中定义变量
- 在同一函数中定义变量及其静态等效项
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 如何将 int 和 int* 传递到函数中以定义变量
- 在定义变量时调用类函数
- 定义变量与模板
- 定义变量类型
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- C 如何基于另一个变量和某些算术定义变量的值
- C 可以指向具有定义变量的函数
- C 定义变量设置值