Подтвердить что ты не робот

Не удалось преобразовать {...} из <список элементов инициализации, заключенных в скобки> в структуру

Я ранее использовал TDM-GCC-5.10 и теперь переключился на 4.9 MINGW-GCC и получил странную ошибку при попытке использовать инициализацию списка:

class Vector2
{
public:
    Vector2(float x, float y)
    {
        this->x = x;
        this->y = y;
    }
    float x = 0.f;
    float y = 0.f;
};

struct Test
{
    int x = 0;
    Vector2 v;
};

int main()
{    
    Test tst = {0,Vector2(0.0f,0.0f)}; //Error
    return 0;
}

Ошибка:

main.cpp: In function 'int main()':
main.cpp:21:41: error: could not convert '{0, Vector2(0.0f, 0.0f)}' from '<brace-enclosed initializer list>' to 'Test'
         Test tst = {0,Vector2(0.0f,0.0f)}; //Error
                                         ^

Я использовал С++ 14 с обоими компиляторами. Что не так?

4b9b3361

Ответ 1

Проблема здесь:

struct Test
{
    int x = 0; // <==
    Vector2 v;
};

До недавнего времени инициализатор элемента по умолчанию помешал классу быть агрегатом, поэтому вы не можете использовать для них агрегатную инициализацию. Gcc 4.9 все еще реализует старые правила здесь, тогда как gcc 5 использует новые.

Ответ 2

Вы пропустили ; после определения вашего класса и после int x = 0. Тогда у вас много ошибок и, по-видимому, только считается последним. Но ваш компилятор был сбит с толку, потому что Vector2 не был определен (из-за отсутствия ;).

Это компилируется:

int main()
{
    class Vector2
    {
    public:
        Vector2(float x, float y)
        {
            this->x = x;
            this->y = y;
        }
        float x = 0.f;
        float y = 0.f;
    };

    struct Test
    {
        int x;
        Vector2 v;
    };

    Test tst = {0,Vector2(4,5)};
    return 0;
}

Ответ 3

// 10.3  lowest common ancestor

// Solution: A brute-force approach is to see if the nodes are in different
// immediate subtrees of the root, or if one of the nodesis the root

#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct Node {
  T data;

  unique_ptr<Node<T>> left;
  unique_ptr<Node<T>> right;
};

struct Status {
  int num_target_nodes;
  //   Node<int>* ancestor;
  unique_ptr<Node<int>> ancestor;
};

Status lcaHelper(unique_ptr<Node<int>>& root, unique_ptr<Node<int>>& node0,
                 unique_ptr<Node<int>>& node1) {
  if (root == nullptr) {
    return {0, nullptr};
  }

  auto l = lcaHelper(root->left, node0, node1);

  if (l.num_target_nodes == 2) return l;

  auto r = lcaHelper(root->right, node0, node1);

  if (r.num_target_nodes == 2) return r;

  int num_target_nodes = l.num_target_nodes + r.num_target_nodes +
                         (root == node0) + (root == node1);

  return {num_target_nodes, num_target_nodes == 2 ? root : nullptr};

  //   return {num_target_nodes, num_target_nodes == 2 ? root.get() :
  //   nullptr};
}

// Node<int>* lca(unique_ptr<Node<int>>& root, unique_ptr<Node<int>>& node0,
//                unique_ptr<Node<int>>& node1) {
unique_ptr<Node<int>> lca(unique_ptr<Node<int>>& root,
                          unique_ptr<Node<int>>& node0,
                          unique_ptr<Node<int>>& node1) {
  return lcaHelper(root, node0, node1).ancestor;
}

int main() {}

Я попробовал этот похожий пример из книги elements of programming interview. Это показывает ту же проблему, и ответ выше не совсем применим к этому случаю. Я использую g++ -std = c ++ 11 с gcc версии 8.3.0 (Ubuntu 8.3.0-6ubuntu1)