C++98 中的类型名和结构定义

Typename and Struct definition in C++98

提问人:Orpicon 提问时间:7/10/2023 最后编辑:Eldinur the KolibriOrpicon 更新时间:7/10/2023 访问量:103

问:

在旧的 C++ 标准中使用 with 存在问题。我有以下错误:typenamesstruct

错误:没有用于调用的匹配函数

这就是我在编译时得到的。有了更新,它的工作方式与我所期望的一样。C++98 standardC++11

我用 a 定义了一个结构体,在函数中,我用一些值从 my 初始化了 struct。然后我打印结构的成员:templatemain()Pairtemplated 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;
};

它工作正常。

有人可以解释为什么它是这样工作的吗?

C ++98

评论

3赞 Ted Lyngmo 7/10/2023
我不明白它如何像您声称的那样与 C++98 一起“正常工作”。它到处都失败了Pair<int> p1{5, 6};p1 = { 2, 3 };

答:

3赞 Miles Budnek 7/10/2023 #1

默认成员初始值设定项是 C++11 中添加到语言中的一项功能。这意味着成员声明的一部分在 C++11 之前格式不正确。= 0Pair

C++11 中还添加了统一初始化语法,这意味着在 C++11 之前,并且格式也不正确。Pair<int> p1 { 5, 6 }p1 = { 2, 3 }

更改 as you did 的定义可以解决第一个问题,但不能解决第二个问题。要获得与 C++98 相同的功能,您需要将用户定义的构造函数添加到:PairPair

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 之前是有效的。更新了答案。