提问人:Orpicon 提问时间:7/10/2023 最后编辑:Eldinur the KolibriOrpicon 更新时间:7/10/2023 访问量:103
C++98 中的类型名和结构定义
Typename and Struct definition in C++98
问:
在旧的 C++ 标准中使用 with 存在问题。我有以下错误:typenames
struct
错误:没有用于调用的匹配函数
这就是我在编译时得到的。有了更新,它的工作方式与我所期望的一样。C++98 standard
C++11
我用 a 定义了一个结构体,在函数中,我用一些值从 my 初始化了 struct。然后我打印结构的成员:template
main()
Pair
templated struct
#include <iostream>
template <typename T>
struct Pair
{
T first = 0;
T second = 0;
};
int main()
{
Pair<int> p1 { 5, 6 };
std::cout << p1.first << ' ' << p1.second << '\n';
p1 = { 2, 3 };
std::cout << p1.first << ' ' << p1.second << '\n';
return 0;
}
GDB 编译器告诉我:main.cpp: In function ‘int main()’: main.cpp:12:25: error: no matching function for call to ‘Pair::Pair()’ 12 | Pair<int> p1 { 5, 6 };
但是,如果我们将结构中成员的声明更改为:
struct Pair
{
T first;
T second;
};
它工作正常。
有人可以解释为什么它是这样工作的吗?
答:
3赞
Miles Budnek
7/10/2023
#1
默认成员初始值设定项是 C++11 中添加到语言中的一项功能。这意味着成员声明的一部分在 C++11 之前格式不正确。= 0
Pair
C++11 中还添加了统一初始化语法,这意味着在 C++11 之前,并且格式也不正确。Pair<int> p1 { 5, 6 }
p1 = { 2, 3 }
更改 as you did 的定义可以解决第一个问题,但不能解决第二个问题。要获得与 C++98 相同的功能,您需要将用户定义的构造函数添加到:Pair
Pair
template <typename T>
struct Pair
{
T first;
T second;
Pair() : first(), second() {}
Pair(T f, T s) : first(f), second(s) {}
};
int main()
{
Pair<int> p1(5, 6);
std::cout << p1.first << ' ' << p1.second << '\n';
p1 = Pair<int>(2, 3);
std::cout << p1.first << ' ' << p1.second << '\n';
return 0;
}
评论
0赞
Ben Voigt
7/10/2023
在 C++11 之前,初始值设定项列表在语法中才成为独立产品,因此(这不是初始化,因此“统一初始化”无关紧要)在 C++11 之前格式不正确,即使 Pair 是聚合,而聚合接受初始化。p1 = { 2, 3 };
Pair<int> p1 = { 2, 3 };
0赞
Miles Budnek
7/10/2023
@BenVoigt是的,我不知道为什么我认为这在 C++11 之前是有效的。更新了答案。
评论
Pair<int> p1{5, 6};
p1 = { 2, 3 };