C ++ accesstiti c массив constexpr - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь получить некоторые значения из массива, который объявлен в другом классе. Массив имеет фиксированную длину и постоянные элементы (я никогда не буду изменять его значения на 100%, поэтому я сделал его постоянным).

Однако, когда я пытаюсь получить доступ к первому элементу в функции main , Я получаю ошибку компиляции:

basavyr@Roberts-MacBook-Pro src % g++ -std=c++11 main.cc
Undefined symbols for architecture x86_64:
  "Vectors::vec1", referenced from:
      _main in main-c29f22.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

Как видите, я компилирую на macOS Catalina с использованием clang (последняя версия).

[Q]: В чем может быть проблема ? Заранее спасибо.

Вот код:

#include <iostream>

class Dimension
{
public:
    static constexpr int dim1 = 2;
    static constexpr int dim2 = 1;
};

class Vectors
{
public:
    static constexpr double vec1[2] = {4.20, 6.9};
};

int main()
{
    auto a = Vectors::vec1[0]; //I also tried initializing this to a value rather than just accessing it directly through the class like I did below
    std::cout << a << "\n";
    std::cout << Vectors::vec1[0] << "\n"; 
    return 0;
}

1 Ответ

6 голосов
/ 14 января 2020

Вы компилируете в режиме C ++ 11; вам нужно предоставить определение для этих constexpr static членов в области имен. Обратите внимание, что это не требуется, поскольку c ++ 17.

Если const non-inline (since C++17) stati c элемент данных or a constexpr static data member (since C++11) используется odr, определение в области пространства имен все еще требуется, но он не может иметь инициализатор. This definition is deprecated for constexpr data members (since C++17).

например

class Dimension
{
public:
    static constexpr int dim1 = 2;
    static constexpr int dim2 = 1;
};

constexpr int Dimension::dim1;
constexpr int Dimension::dim2;

class Vectors
{
public:
    static constexpr double vec1[2] = {4.20, 6.9};
};

constexpr double Vectors::vec1[2];
...