Error expression in new declarator must have integral or enumeration type

указатели + класс = ошибка, не пойму C++ Решение и ответ на вопрос 2472762

Здравствуйте!

Вводная:
Новичок, использую учебник «С++ за 21 день», изучил(видимо, плохо, см. ниже) 9 глав. Пишу код в CodeBlocks. Компилятор GNU GCC.

Задача:
Из учебника «С++ за 21 день» делаю упражнение:
«4. Напишите класс Circle, который вычисляет площадь и периметр по радиусу, который передается классу как параметр во время создания экземпляра. Число Пи должно содержаться в константном закрытом члене, к которому нельзя обратиться извне класса.»

Что делал:
1. написал код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cmath>
#include <string>
 
using namespace std;
 
class Circle
{
    private:
        const float Pi = 3.141;
 
    public:
        float* pR;
        string* pDimension;
        float* pS;
        float* pP;
 
        Circle(const float* pInR, const string* pInDimension)
        {
            pR = new float[pInR];
            pDimension = new string[pInDimension];
            pS = new float[0];
            pP = new float[0];
            cout << endl;
            cout << "Vvedennie znacheniia: R = " << pInR << "" << pInDimension << "." << endl;
            pS = floor((Pi * pow(pInR, 2))*100)/100;
            cout << "S = " << pS << " " << pInDimension << "." << endl;
            pP = 2 * Pi * pInR;
            cout << "P = " << pP << " " << pInDimension << "." << endl;
        }
 
        ~Circle()
        {
            delete pR;
            delete [] pDimension;
            delete pS;
            delete pP;
        }
};
 
int main()
{
    float radius = 0;
    do
    {
        cout << "Vvedite radius > ";
        cin >> radius;
    } while(radius == 0);
    cout << "Vvedite razmernost > ";
    string razmernost;
    cin >> razmernost;
    Circle* Figura = new Circle(&radius, &razmernost);
 
    return 0;
}

2. Хочу сделать программу где члены класса и сам класс резервируется в динамической памяти.
Строка 52 — передаю, введенные значения как ссылки в конструктор класса.
Строка 18 — конструктор принимает значения в виде указателей(или я неправильно описал что написал в коде? ).
Строка 20 — делаю запрос на резервирование памяти для переменной типа «float».
Компилятор сообщил об ошибке, она описана ниже.
3. Конструктор копий пока не делал т.к. нужно разобраться с ошибкой что ниже опишу.

Что не понятно:
1. Компилятор для строки 20 пишет следующее: «error: expression in new-declarator must have integral or enumeration type».
Эм… не пойму что он от меня хочет… Дословно звучит так: «выражение в новом объявителе должно иметь тип целого или перечисления», я ему написал тип float, на тип int так же ругается.
Что сделано не так?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

Я не понимаю, почему я получаю эту ошибку. Раньше я использовал тот же код, и это не дало мне никаких проблем, но теперь по какой-то причине я получаю сообщение об ошибке.

            outputf3 << "The sorted list is as follows: nn";
            sorting = new float [function.sort()]; // Here is where the error is.
            for (i=0; i < length ; i ++)            
            {
            outputf2 << "n" << sorting[i] ;
            }

По какой-то причине он говорит
error: expression in new-declarator must have integral or enumeration type

Но я использовал то же самое здесь в предыдущей части программы.

           inputs = new float[length];
           inputf.clear();
           inputf.seekg(0, std::ios_base::beg);

Понятия не имею, зачем он вообще это делает. Я читаю случайные числа из файла, затем сортирую их в другой части функции и записываю в выходной файл.

2 ответы

Почему вы думаете:

inputs = new float[length];

такой же как

sorting = new float [function.sort()];

?

Если не function является экземпляром класса и sort возвращает целочисленный тип, он точно не сработает.

Заявление:

Type* t = new Type[x];

динамически распределяет x объекты типа Type. Довольно очевидно, почему x должно быть цельного типа.

РЕДАКТИРОВАТЬ: Согласно вашему комментарию:

Размер, который будет выделен должен быть цельного типа, но вы возвращаете float. Но даже тогда в этом не было бы смысла. Вам нужно вернуть размер inputs.

ответ дан 23 мар ’12, в 18:03

Я собираюсь рискнуть и сказать, что function.sort () возвращает void. имея в виду эту строку:

sorting = new float [function.sort()];

это то же самое, что писать …

sorting = new float [void];

что не имеет никакого смысла. вам, вероятно, нужна длина того, над чем работает function.sort ()?

ответ дан 23 мар ’12, в 18:03

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c++
sorting
types
new-operator
file-io

or задайте свой вопрос.

В С++ 14 дан следующий код:

void foo() {
  double d = 5.0;
  auto p1 = new int[d];
}

clang компилирует это без диагностики, в то время как gcc, с другой стороны, выдает следующую диагностику (см. это в Godbolt):

error: expression in new-declarator must have integral or enumeration type
    7 |     auto p1 = new int[d];
      |                       ^

Я специально обозначил этот С++ 14, потому что в режиме С++ 11 clang рассматривает это как плохо сформированное и производит следующую диагностику (см. Это в прямом эфире):

error: array size expression must have integral or unscoped enumeration type, not 'double'
    auto p1 = new int[d];
              ^       ~

Является ли лязг правильно? Если так, что изменилось в С++ 14, чтобы это разрешить?

12 дек. 2018, в 15:53

Поделиться

Источник

2 ответа

Clang верен, ключевая формулировка в [expr.new] p6 отличается от следующей в черновике C++ 11:

Каждое константное выражение в деклараторе noptr-new должно быть целочисленным константным выражением ([expr.const]) и иметь строго положительное значение. Выражение в noptr-new-объявителе должно иметь целочисленный тип, тип перечисления с незаданной областью или тип класса, для которого существует единственная неявная функция преобразования в тип перечисления с целой или незаданной областью ([class.conv]). Если выражение имеет тип класса, выражение конвертируется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного выражения….

на это в проекте C++ 14:

Каждое константное выражение в объявителе noptr-new должно быть преобразованным константным выражением ([expr.const]) типа std::size_t и должно принимать строго положительное значение. Выражение в деклараторе noptr-new неявно преобразуется в std::size_t

В C++ 14 требование для выражения в noptr-new-деклараторе было ослаблено, чтобы не требовать целочисленного перечисления с незаданной областью или класса с единственной неявной функцией преобразования для одного из этих типов, а просто разрешать неявные преобразования в size_t,

Изменения в формулировке произошли от предложения A Tweak Certain C++ Contextual Conversions, v3.

Shafik Yaghmour
12 дек. 2018, в 14:43

Поделиться

От c++14 до c++17 (для тех, кто интересуется, как я), фраза остается практически такой же (в отличие от С++ 11 до С++ 14, как ответил @ShafikYaghmour), как указано в этом С++ 17 черновик:

Каждое константное выражение в деклараторе noptr-new должно быть преобразованным константным выражением типа std::size_t и должно принимать строго положительное значение. Выражение в деклараторе noptr-new неявно преобразуется в std::size_t. [..]

только эта часть ([expr.const]) отсутствует в проекте С++ 17.

gsamaras
14 дек. 2018, в 15:10

Поделиться

Ещё вопросы

  • 0Установка xdebug в Ubuntu 14.04 без создания файла xdebug.ini
  • 0Загрузить контроллер angularJs
  • 0Как сделать так, чтобы значок приложения отображался в мобильных приложениях клиента при загрузке
  • 1Android, я должен сделать MediaPlayer сервисом?
  • 1Как сделать снимок в qcow2 программным способом?
  • 0Как уменьшить высоту области содержимого для <p> с помощью CSS?
  • 0JQuery действует странно в IE, когда я НЕ в режиме совместимости
  • 1Как реализовать синглтон со стратегиями?
  • 0Форма PHP не отправляется на следующую страницу
  • 1Генерация 1000 случайных чисел от 13 до 100
  • 0динамический флажок андроид
  • 1получить текущую позицию из DataInputStream в Java
  • 0php искать исходный код URL для конкретного слова, а затем перенаправить на URL
  • 1Создание Discord Bot в Python: Как сделать разговор о переключателе для ChatBot
  • 0jQuery Mobile переходит на предыдущую страницу
  • 1Express + MongoDB — запрос объекта
  • 1Создание кнопок вкладки Android Market
  • 0Какой самый эффективный способ PHP прочитать первую и последнюю строку файла?
  • 0MySQL вставка не вставляя предполагаемое значение
  • 1Получить идентификатор входящего звонка Sip
  • 0Безопасное встраивание строки в C-код (Безопасная строка, Безопасный символ *)
  • 0Как определить внутреннюю ширину браузера для мобильных устройств
  • 0Как исправить изображение в правом нижнем углу с изменением размера окна?
  • 0Показывать различный контент в соответствии с переключателем
  • 0Дно границы отсутствует
  • 1Текст ошибки не отображается для результата функции
  • 0Сделать пользовательский интерфейс недоступным для редактирования, когда мы переходим с одной страницы на другую
  • 0условно в зависимости от стиля
  • 1Недопустимое имя переменной Statsmodels (Patsy) / объект ‘Series’ не вызывается Ошибка
  • 1Возможно ли иметь десятичную ось X для линейного графика?
  • 0Содержимое по умолчанию до разрешения маршрута
  • 0Angularjs вход [радио] с уникальной нг-моделью не отключается
  • 1проверить два значения столбца двух CSV-файлов и, если совпадение найдено, записать в другой CSV-файл
  • 0SQL — вернуть строки, которые не имеют определенного значения
  • 0Как выполнить несколько запросов в sqlapi ++ с оракулом
  • 1Как редактировать значение с помощью Entity Framework?
  • 0C ++ — доступ к значениям в динамических массивах
  • 1Как удалить файлы в AppData / Temp после загрузки файла с помощью .NET WebAPI 2? Ошибка файла в использовании
  • 0Простой поиск в массиве C ++
  • 1Использование запросов на обновление с objectdb
  • 0LocalSettings.php не читается (MediaWiki, Xampp)
  • 0Проверьте, находится ли дата в определенном диапазоне дат PHP [дубликаты]
  • 0Измените UL стиля выбора JQuery для работы без BootstrapJS
  • 1C # Windows Forms для смешивания VS2013
  • 0ng-click не работает на объектах с непрозрачностью: 1;
  • 0Как написать запрос выбора вместе с условием IF вместо имени столбца в запросе MySQL
  • 1<form> отключил мой код JavaScript
  • 0Как показать или скрыть вкладку на основе URL страницы
  • 0JQuery добавить — для ввода, но только добавить дважды
  • 0Собираюсь изучать C, должен ли я просто использовать свой компилятор C ++ и IDE?

Сообщество Overcoder

В C ++ 14 дан следующий код:

void foo() {
double d = 5.0;
auto p1 = new int[d];
}

clang компилирует это без диагностики, в то время как gcc, с другой стороны, производит следующую диагностику (увидеть это жить в Godbolt):

error: expression in new-declarator must have integral or enumeration type
7 |     auto p1 = new int[d];
|                       ^

Я специально обозначил этот C ++ 14, потому что в режиме C ++ 11 clang рассматривает это как плохо сформированное и производит следующую диагностику (увидеть это жить в Godbolt):

error: array size expression must have integral or unscoped enumeration type, not 'double'
auto p1 = new int[d];
^       ~

Правильный ли лязг? Если так, что изменилось в C ++ 14, чтобы это разрешить?

41

Решение

Лязг правильно, ключевая формулировка в [Expr.new] р6 отличается от следующего в проекте C ++ 11:

каждый константа-выражение в noptr новый-описатель должно быть целочисленным константным выражением ([expr.const]) и иметь строго положительное значение. Выражение в noptr новый-описатель должен иметь целочисленный тип, тип перечисления с незаданной областью или тип класса, для которого существует единственная неявная функция преобразования в тип перечисления с целой или незаданной областью ([Class.conv]). Если выражение относится к типу класса, выражение конвертируется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного выражения. …

в это в проекте C ++ 14:

каждый константа-выражение в noptr новый-описатель должно быть преобразованным константным выражением ([expr.const]) типа std::size_t и оценим до строго положительного значения. Выражение в noptr новый-описатель неявно преобразуется в std::size_t. …

В C ++ 14 требование для выражения в noptr новый-описатель был ослаблен, чтобы не потребовать целочисленного перечисления с незаданной областью или класса с
единственная неявная функция преобразования в один из этих типов, но просто позволяющая неявное преобразование в size_t.

Изменение в формулировке произошло от предложения Предложение по настройке некоторых контекстных преобразований C ++, версия 3.

43

Другие решения

С С ++ 14 до C ++ 17 (для тех, кто интересуется, как я), формулировка остается практически такой же (в отличие от C ++ 11 до C ++ 14, как ответил @ShafikYaghmour), как указано в этом C ++ 17 черновик:

каждый константа-выражение в noptr новый-описатель должно быть преобразованным константным выражением типа std::size_t и оценим до строго положительного значения. Выражение в noptr новый-описатель неявно преобразуется в std::size_t. [..]

только с этой частью ([expr.const]) отсутствует в проекте C ++ 17.

1

Clang верен, ключевые формулировки в [expr.new] p6 отличаются от следующих в черновике C++ 11:

Every constant-expression in a noptr-new-declarator shall be an integral constant expression ([expr.const]) and evaluate to a strictly positive value. The expression in a noptr-new-declarator shall be of integral type, unscoped enumeration type, or a class type for which a single non-explicit conversion function to integral or unscoped enumeration type exists ([class.conv]). If the expression is of class type, the expression is converted by calling that conversion function, and the result of the conversion is used in place of the original expression. …

Кому: это в проекте C++ 14:

Every constant-expression in a noptr-new-declarator shall be a converted constant expression ([expr.const]) of type std::size_t and shall evaluate to a strictly positive value. The expression in a noptr-new-declarator is implicitly converted to std::size_t. …

В C++ 14 требование для выражения в noptr-new-declarator было ослаблено, чтобы не требовать целочисленного перечисления без области видимости или класса с
единственная неявная функция преобразования в один из этих типов, но позволяет просто неявное преобразование в size_t.

Изменение формулировки связано с предложением Предложение по настройке некоторых контекстных преобразований C++, v3.

You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an alternative browser.
  • Forums

  • Other Sciences

  • Programming and Computer Science

Gauss-legendre c++

  • C/C++

  • Thread starter
    ggeo1

  • Start date
    Mar 10, 2011

  • Mar 10, 2011
  • #1
Hello , i have the algorithm attached and i am trying to execute it in c++.

My code until now is : ( i have created the function f with limits (-1,1) )

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>

using namespace std;

const double pi=3.14;

double f(double x){
double y;
y=(pi/4.0)*(log((pi*(x+1.0))/4.0 +1.0));
return y;

}

double legendre (int n){

    double *L,*w,*t;
    double x,sum1,sum2,result;
    L=new double [n];
    w=new double [n];
    t=new double [x];


        while(n<10){

         L[0]=1;
         L[1]=x;



        for (int i=1;i<=10;i++){
        L[i+1]=((2.0*i+1.0)*x*L[i] - i*L[i-1])/(i+1.0);


        }

        w=0;
        for (int i=1;i<=10;i++){
        w[i]+=(2.0*(1.0-x*x))/(i*i*(L[i-1]*L[i-1]));
        }
      
        for (int i=1;i<=10;i++){
            sum1=0.0;
            for (int k=1;k<=2*n-1;k+=2){
                sum1+=w[i]*(pow(t[i],k));
            }
                sum1=0;
                sum2=0.0;
                for(int k=0;k<=2*n-2;k+=2){
                    sum2+=w[i]*(pow(t[i],k));
                }
                sum2=2.0/n;
        }

    }

    result=w*f(t);

    return result;

}

int main()
{
    double eps=1e-8;//accuracy
    double exact=0.8565899396;//exact solution for the integral
    double error=1.0;
    double result;

    int n=1;//initial point

    while (fabs(error-exact)>eps) {
        result=legendre(n);
        cout <<"nFor n = "<<n<<",error = "<<fabs(error-exact)<<",value = "<<result;

    n++;
    }

    return 0;
}

I have the following problems:

(first of all i am not sure if am doing it right..)

1) I am not sure how to connect the whole thing.I am computing L[i+1],w and then sum1 and sum2 but i can’t figure how to connect them.
2) In the point i am writing result=w*f(t) ,the compiler gives me an error.I can’t insert a pointer (t here) in a function as argument?

Any help is appreciated…

Attachments



Last edited: Mar 10, 2011

Answers and Replies

  • Mar 10, 2011
  • #2
For #2: «t» is a pointer to a double, and the function f() wants a double as an argument. So most likely you want to de-reference t: result=w*f(*t);

For #1: I don’t know what you mean by «connecting the whole thing», because I’m not familiar with the function you are computing.

  • Mar 11, 2011
  • #3
This will crash…

You set n = 1…

You call legendre(n)…

Then inside legendre(int) you say w=new double [n];

In other words n = 1 and w has a length of 1.

But then you iterate i from 1 to 10 and say :
sum1+=w*(pow(t,k));
This will crash or at least badly misbehave unless w has a length of at least 11.

Maybe it would help if you posted the specific algorithm you are trying to implement.

  • Mar 12, 2011
  • #4
Hello ,
i have the algorithm attached.

the compiler gives me the following errors:
where i have «t=new double [x];» it gives -> error: expression in new-declarator must have integral or enumeration type|

and where » result=w*f(*t); » ->error: invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’|

(note :i changed result=w*f(t) to result = w*f(*t)

And as i said , i don’t know if i implemented the algorithm right.

Thanks for helping.

  • Mar 12, 2011
  • #5
Hello ,
i have the algorithm attached.

the compiler gives me the following errors:
where i have «t=new double [x];» it gives -> error: expression in new-declarator must have integral or enumeration type|

You can’t do this, which is what the compiler error message is saying. There are several things wrong here.
1. x is a local variable of type double. When you declare an array, the number must be an integral type (int, long, char, short, etc.) or a value of an enum.
2. Even if you could declare an array with a double or float number of elements, x is an uninitialized local variable.

and where » result=w*f(*t); » ->error: invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’|

(note :i changed result=w*f(t) to result = w*f(*t)

And as i said , i don’t know if i implemented the algorithm right.

Thanks for helping.

Suggested for: Gauss-legendre c++

  • Last Post
  • Jul 3, 2022
  • Last Post
  • Jun 22, 2022
  • Last Post
  • Aug 7, 2022
  • Last Post
  • Aug 9, 2022
  • Last Post
  • Oct 3, 2022
  • Last Post
  • Aug 11, 2022
  • Last Post
  • Jun 7, 2021
  • Last Post
  • Nov 22, 2022
  • Last Post
  • Jun 10, 2021
  • Last Post
  • Dec 14, 2020
  • Forums

  • Other Sciences

  • Programming and Computer Science

Понравилась статья? Поделить с друзьями:
  • Error exportarchive no signing certificate ios distribution found
  • Error failed building wheel for python ldap
  • Error failed building wheel for pytelegrambotapi
  • Error failed building wheel for pygraphviz
  • Error failed building wheel for pycuda