Error c4430 missing type specifier int assumed note c does not support default int

i have a problem with following code: Generator.h: #pragma once class Generator { public: friend class BagObject; Generator(void); ~Generator(void); ... void generator(int);

i have a problem with following code:

Generator.h:

#pragma once
class Generator
{
public:
    friend class BagObject; 
    Generator(void);
    ~Generator(void);
    ...
    void generator(int);
private:
    BagObject *object;
    vector<BagObject> data; //Error c4430
};

and this is a error:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

there is 6 more errors but i believe that they should disappeared after solving this problem.

this is the cpp file. I couldn’t paste it on the first time.
Generator.cpp

#include "stdafx.h"
#include "Generator.h"
#include "BagObject.h"
#include <iostream>
#include <vector>
#include <ctime>

using namespace std;


Generator::Generator(void)
{
    srand(time(NULL));
}


Generator::~Generator(void)
{
    data.clear();
}

void Generator::generator(int ld)
{
    for (int i = 0; i<ld; i++)
{
    object = new BagObject(rand(),rand(),i);
    data.push_back(object);
    }
}


int main()
{
    Generator *g = new Generator;
    g->generator(10);
    return 0;
}

Vlad from Moscow's user avatar

asked Nov 14, 2016 at 17:51

HeHacz's user avatar

1

Either you forgot to include header

#include <vector>

or forgot to write directive

using namespace std;

In any case it would be better to write

#include <vector>

//...

std::vector<BagObject> data;
^^^^^

You have to include the header <vector> in all headers where there is a reference to std::vector.

answered Nov 14, 2016 at 17:54

Vlad from Moscow's user avatar

Vlad from MoscowVlad from Moscow

287k23 gold badges179 silver badges323 bronze badges

15

Other answers are correct, but cryptic. In plain English, your header does not know about BagObject class. You included BagObject.h in the .cpp, but you should have included it in the .h.

It also does not know about vector for the same reason.

I am guessing, you were under impression that .cpp had to use #include, but .h did not. This is a common misunderstanding of beginners in C++. Headers need to include all referenced class declarations, hence you need to elevate your includes from .cpp into your .h.

Move two mentioned includes into the header and it will work.

answered Mar 28, 2018 at 14:51

ajeh's user avatar

ajehajeh

2,6002 gold badges31 silver badges61 bronze badges

1

vector may not be instantiated with an incomplete type. In order to have vector<BagObject> data; in the header, the header must also have #include "BagObject.h".

(This is in addition to the changes recommended in Vlad’s answer)

answered Nov 14, 2016 at 20:33

M.M's user avatar

M.MM.M

137k21 gold badges201 silver badges349 bronze badges

I know your problem is solved but in My case the same error was caused due to cyclic includes (i.e. I had accidentally included the .h file in one of the .h file included in it)

TextureManager.h (The file with the error)

// This is TextureManager.h
#pragma once
#include "Game.h"
#include "GameObject.h"

/*
 texture manager class
*/

GameObject.h

// This is GameObject.h
#pragma once
#include "game.h"
#include "TexutureManager.h" // Accidental
/*

*/

I thought it may be worth noting this is also one of the ways to get this error.

answered Jul 27, 2022 at 6:35

Aravind's user avatar

  • Remove From My Forums
  • Question

  • HI

    I have been using a third party provided header file in my .NETClass Library project (VS2008). It is generating a lot of errors of some thing like that 

    « C4430: missing type specifier — int assumed. Note: C++ does not support default-int«

    Some of the code is:

    #ifndef __TESTSDK_H__
    #define __TESTSDK_H__
    
    #ifdef	TESTSDK_EXPORTS
    #define	SDKAPI	__declspec( dllexport )
    #else
    #define	SDKAPI	__declspec( dllimport )
    #endif
    
    #ifdef	__cplusplus
    extern "C" {
    #endif	/* def __cplusplus	*/
    
    typedef struct _STATUSVERSION {			//Status information version
    	WORD MajorVersion ;					//Major version
    	WORD MinerVersion ;					//miner version
    }STATUSVERSION, *LPSTATUSVERSION ;
    
    #ifdef	__cplusplus
    }
    #endif	/* def __cplusplus	*/
    
    #endif	/* __TESTSDK_H__	*/

    and It generates the following Errors

    Error	2	error C2146: syntax error : missing ';' before identifier 'MajorVersion'
    Error	3	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    Error	4	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    Error	5	error C2146: syntax error : missing ';' before identifier 'MinerVersion'
    Error	6	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    Error	7	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    What causing these Errors ??

Answers

  • scarus wrote:

    and It generates the following Errors

    Error 2 error C2146: syntax error : missing ‘;’ before identifier  ‘MajorVersion’

    Looks like you are expected to #include <windows.h> before you include  this header.


    Igor Tandetnik

    • Marked as answer by

      Thursday, September 16, 2010 12:50 PM

m0

2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

1

04.08.2014, 17:43. Показов 14879. Ответов 17

Метки нет (Все метки)


Вот так простенький код

C++
1
2
3
4
5
6
7
8
#pragma once
#include "A.h"
class B
{
public:
    B(void);
    ~B(void);
};
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "B.h"
class A
{
public:
    A(void);
    virtual ~A(void);
    B b;
};

Ругается на переменную B b; Как тогда объявить переменную типа В?

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



0



102 / 75 / 17

Регистрация: 23.07.2014

Сообщений: 877

Записей в блоге: 1

04.08.2014, 17:47

2

m0, вы хотите циклическое включение заголовочных файлов устроить? Не выйдет.



0



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 18:09

 [ТС]

3

Окей, что мне делать?



0



ValeryS

Модератор

Эксперт по электронике

8759 / 6549 / 887

Регистрация: 14.02.2011

Сообщений: 22,972

04.08.2014, 18:19

4

Цитата
Сообщение от m0
Посмотреть сообщение

Окей, что мне делать?

Выбросить одно включение и объявить класс
типа так

C++
1
2
3
4
5
6
7
8
9
#pragma once
class B;
class A
{
public:
    A(void);
    virtual ~A(void);
    B b;
};



0



102 / 75 / 17

Регистрация: 23.07.2014

Сообщений: 877

Записей в блоге: 1

04.08.2014, 18:25

5

m0, или вообще убрать #include «A.h». Разве классу B класс A нужен? Если они используют что-то общее (typedef’ы, например), вынесите это общее в отдельный хэдер.



0



m0

2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 18:41

 [ТС]

6

CyberSolver, Да нужен, я просто привел простой пример. Мне нужно чтобы у каждого класса была переменная с типом другого.

C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "A.h"
class B
{
public:
    B(void);
    ~B(void);
    A* a;
};
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "B.h"
class A
{
public:
    A(void);
    virtual ~A(void);
    B* b;
};

Error 2 error C4430: missing type specifier — int assumed. Note: C++ does not support default-int
Error 3 error C2143: syntax error : missing ‘;’ before ‘*’



0



102 / 75 / 17

Регистрация: 23.07.2014

Сообщений: 877

Записей в блоге: 1

04.08.2014, 18:43

7

m0, тогда не парьтесь и объявите их в одном месте.



0



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 20:09

 [ТС]

8

CyberSolver, Ну это я здесь два простеньких класса привел, на самом деле у меня два больших класса, и мне нужна такая переменная в каждом из них.



0



CyberSolver

102 / 75 / 17

Регистрация: 23.07.2014

Сообщений: 877

Записей в блоге: 1

04.08.2014, 20:18

9

m0, ну если они содержат по указателю друг на друга, и вы непременно хотите разделения — на напишите что-ли отдельный заголовочник

C++
1
2
class A;
class B;

и включите в оба.

Если не указатели, а сами — придется пихать в один.



1



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 20:20

 [ТС]

10

CyberSolver, Про отдельный заголовочный файл не понял



0



CyberSolver

102 / 75 / 17

Регистрация: 23.07.2014

Сообщений: 877

Записей в блоге: 1

04.08.2014, 20:24

11

Цитата
Сообщение от CyberSolver
Посмотреть сообщение

Если они используют что-то общее (typedef’ы, например), вынесите это общее в отдельный хэдер.

m0, я про это. Пусть в отдельном хэдере просто будет

Цитата
Сообщение от CyberSolver
Посмотреть сообщение

C++
1
2
class A;
class B;

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



0



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 20:27

 [ТС]

12

Фак, есть какая-то книга где в качестве примера проектируется реальное приложение? желательно через тестирование. А то учебные примеры слишком унылы.



0



327 / 230 / 55

Регистрация: 30.05.2014

Сообщений: 682

04.08.2014, 20:33

13



1



ValeryS

Модератор

Эксперт по электронике

8759 / 6549 / 887

Регистрация: 14.02.2011

Сообщений: 22,972

04.08.2014, 20:39

14

Цитата
Сообщение от CyberSolver
Посмотреть сообщение

Если не указатели, а сами — придется пихать в один

только указатели иначе не скомпилится
например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A;
class B;
class A
{
public:
 int i1;
 B b;
}
 
class B
{
public:
 int i1;
 A a;
}

каков размер объектов данных классов?



0



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 20:41

 [ТС]

15

ValeryS, да большой, поле класса будет содержать массив координат вершин. А их до миллиона может быть и в каждой x, y, z -int;



0



ValeryS

Модератор

Эксперт по электронике

8759 / 6549 / 887

Регистрация: 14.02.2011

Сообщений: 22,972

04.08.2014, 20:49

16

Цитата
Сообщение от m0
Посмотреть сообщение

ValeryS, да большой,

я не про большой
смотри на мой пример
чтобы создать объект класса A нужно выделить память под инт и под класс B
значит высчитываем размер B нам нужно память для итн и под класс A
рассчитываем размер класса A нужно выделить память под инт и под класс B
ну и так далее
я уж не говорю что
при такой записи

C++
1
2
3
4
5
6
7
class B;
class A
{
public:
 int i1;
 B b;
}

компилятор ничего не знает про класс B, кроме того что он будет где то описан
так что при перекрестном использовании только указатели, хотя бы в одном из них



1



2 / 2 / 1

Регистрация: 03.12.2013

Сообщений: 146

04.08.2014, 20:50

 [ТС]

17

ValeryS, Так и сделаю, по другому видимо никак.



0



Модератор

Эксперт по электронике

8759 / 6549 / 887

Регистрация: 14.02.2011

Сообщений: 22,972

04.08.2014, 20:51

18

Цитата
Сообщение от m0
Посмотреть сообщение

содержать массив координат вершин. А их до миллиона может быть и в каждой x, y, z -int;

итого 12 мегабайт, на стеке такое не выделишь, только в куче
значит указатели



0



See more:

Have this error from main() Need help! :(

#include "stdafx.h"
#include <pcap.h>



typedef struct ip_address{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
}ip_address;


typedef struct ip_header{
    u_char  ver_ihl;            u_char  tos;                u_short tlen;               u_short identification;     u_short flags_fo;           u_char  ttl;                u_char  proto;              u_short crc;                ip_address  saddr;          ip_address  daddr;          u_int   op_pad;         }ip_header;


typedef struct udp_header{
    u_short sport;              u_short dport;              u_short len;                u_short crc;            }udp_header;


void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);


main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip and udp";
struct bpf_program fcode;

    
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);
        exit(1);
    }
    
    
    for(d=alldevs; d; d=d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)n", d->description);
        else
            printf(" (No description available)n");
    }

    if(i==0)
    {
        printf("nNo interfaces found! Make sure WinPcap is installed.n");
        return -1;
    }

Updated 24-May-20 13:32pm


Quote:

main()

should be

int main()

The error indicates the missing return type of the main() function. Because main() must return an int, use:

int main()
{
        return 0;
}

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject,
20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8
+1 (416) 849-8900

  • Печать

Страницы: [1] 2  Все   Вниз

Тема: Ошибки при компиляции в VS 2015 с ObjectARX SDK 2017  (Прочитано 7873 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Вот такая ошибка везде идет при компеляции предыдущего проекта ниже arx 2017.
error C4430: missing type specifier — int assumed. Note: C++ does not support default-int
Что куда прописать чтобы она исчезла, вопрос для тех кто это уже прошел? Хотелось бы не тратить на миграцию месяцы в бесконечных поисках по google.

Где вообще найти быструю и полезную справку как мигрировать на  arx 2017. Набираешь например, ошибку и чтобы сразу решение видеть. Есть такая справка у Автодеска?

По установке VS2015 и Arx-wizard’a скажу что «Пути господни неисповедимы» Как случайно все не устанавливалось, так случайно все установилось.  Даже wizard заработал. Но время ушло много к сожалению! Кстати, Александр, твой проект с wizard’а думаю помог, после того как его открыл, VS2015 решил докачать доп. модули. Устанавливал все без интернета.


Записан


Wizard в этих версиях работает? Не пробовал установку/удаление делать от Администратора с отключенным UAC?

в остальных студиях всё работает. UAC я выключаю сразу после установки Windows :) раз и на всегда, но все программы по привычке устанавливаю «от администратора».

А если студию запускать от Администратора?

а я и есть администратор :), но если запустить «от администратора», то результат тот же.

error C4430: missing type specifier — int assumed. Note: C++ does not support default-int Что куда прописать чтобы она исчезла, вопрос для тех кто это уже прошел?

а это, батенька, несоответствие типов. тут подход индивидуальный. раньше, например, я пользовался переменной long или int, если нужно было узнать размер выборки (acedSSLength), хотя автодеск рекомендовал пользоваться Adesk::Int32. раньше проходило, а теперь лавочку прикрыли. та же беда с булевыми типами. так что еще раз повторюсь, каждая такая ошибка лечится индивидуально.

Где вообще найти быструю и полезную справку как мигрировать на  arx 2017. Набираешь например, ошибку и чтобы сразу решение видеть. Есть такая справка у Автодеска?

а еще было б неплохо чтоб была база с готовыми исходниками разных функций :):):). натягал к себе в нужном порядке и готово. но, увы, такого нет. а по поводу миграции — есть в справке ARX файлик arxmgr.chm. причем желательно устранять не только то, что уже не работает в текущей версии (описано в этом файлике) а и пытаться избавиться от того, что помечено к удалению в дальнейших версиях (тоже написано в этом же самом файлике). на моей памяти самым болезненным был переход на юникод, вот там даже мануал был и умельцы делали автоматические «перегонные аппараты» для исходников. а сейчас просто смысла нет. код, написанный в 2012 студии будет 100% рабочим в 2015, при условии, что выполнены все предписания по миграции из файлика arxmgr.chm.
вот если не работает код, тогда лезу смотреть, что ж они там намудрили и делаю заплатки. в этом переходе основная проблема — несоответствие типов. 21 проект перебрал за час. так что ничего страшного в ошибках нет. просто нужно уметь с ними бороться )))


Записан


21 проект перебрал за час. так что ничего страшного в ошибках нет. просто нужно уметь с ними бороться )))

Спасибо! Хотелось бы конструктива как перебирать, что и где менять чтобы так же за час все исправить. Просто таких ошибок в первом же проекте сотни!!! Напишите пожалуйста, конкретно ваш опыт. Для чего этот форум тогда вообще. Прозой  делиться? Хотя бы ссылку дайте.


Записан


Где вообще найти быструю и полезную справку как мигрировать на  arx 2017. Набираешь например, ошибку и чтобы сразу решение видеть. Есть такая справка у Автодеска?

Нет. Это вообще не проблема Autodesk. И это не проблема миграции ObjectARX с 2016 на 2017 версию. Это проблема ужесточения требований компилятора С++ в версии 2015.

Хотя бы ссылку дайте.

Первая ссылка в Гугле описывает причину появления ошибки и как с ней бороться: https://msdn.microsoft.com/en-us/library/ms173696.aspx
В частности нельзя описывать функцию/метод так:

  1. myfunc()

  2. {

  3. return 1;

  4. }

А нужно описывать:

  1. int myfunc()

  2. {

  3. return 1;

  4. }


Записан


Хотелось бы конструктива как перебирать, что и где менять чтобы так же за час все исправить. Просто таких ошибок в первом же проекте сотни!!!

вот если честно, совсем не понял. ну, есть ошибки. и что? исправляем ошибку и становится на одну меньше. и так аж до тех пор, пока проект не соберется в arx-файл.

Для чего этот форум тогда вообще. Прозой  делиться?

ну, иногда и так получается. вот, например, если человек задает конкретный вопрос, он получает конкретный ответ. а если хочется поговорить о жизни :), то тогда можно и прозой поделиться.
ну и если позволите, встречный вопрос. как у вас с С++ и с владением студией в принципе обстоят дела? Если честно, первое, что интуитивно хочется сделать увидев сообщение об ошибке компиляции, это клацнуть дважды на строку с ошибкой, чтоб сама студия подсветила строку в коде, где эта ошибка появляется. ну и глядя уже на строку кода, а не на сообщение error C4430: missing type specifier — int assumed. Note: C++ does not support default-int, гарадзо легче сказать, чего от нас хочет студия.


Записан


Для чего этот форум тогда вообще. Прозой  делиться?

Это форум для помощи тем, которые хотят чтобы им помогали. Для тех, кто и сам прикладывает усилия для того, чтобы решить свой вопрос и для этого занимается самообразованием. И для тех, которые готовы помогать другим.
Мне показалось или я давал совершенно конкретные ответы на поставленные тобою вопросы? И неоднократно. Или это мне приснилось и я только прозой делюсь?


Записан


В частности нельзя описывать функцию/метод так:

Вот это понятно. Конкретно приведен код — уже помощь. Всегда тебя благодарю!
На счет прозы это я на письмо Николая отписал, погорячился. Понятно что ошибка, но что на такую рутину придется уйму времени убить не ожидал. Думал что любимое сообщество подскажет какой-нибудь ТРЮК как проблему быстро решить, сэкономить время. А не бери лопату и разгребай очередную гору выросшую на ровном месте. Все на голову разработчикам валится. Сколько их осталось в России уже?
На счет, что Автодеск ни при чем, может и да, но косвенно, не мигрируешь на 2017 не пустят в их магазин… Сделали бы какую нибудь директиву чтобы одним махом проблема исчезла… 


Записан


Портирование на VS 2015
error C2664: ‘Acad::ErrorStatus AcDbDatabase::readDwgFile(AcDwgFileHandle *,bool,const wchar_t *)’: cannot convert argument 2 from ‘int’ to ‘AcDbDatabase::OpenMode’

  1.                 AcDbDatabase db;

  2.                 db.readDwgFile(LPCTSTR(str), _SH_DENYWR); //error здесь на точке

  3.                 SetListMark(arr, &db);

Что делать? В google решения не нашел.


Записан


Что делать?

Найти .h файл с методом AcDbDatabase::readDwgFile (это dbmain.h) и прочитать:

    // Note that the old overload of this method which took an int _SH_DENYxxx
    // arg is removed. You have to call this method using the OpenMode arg
    // to specify the access and sharing. See above OpenMode comments for
    // the mapping from _SH_DENYxxx to kXXXShare enum vals.

Сделать вывод, что вместо _SH_DENYWR следует использовать kForReadAndReadShare, а так как это значение по-умолчанию, то достаточно будет:
db.readDwgFile(LPCTSTR(str));


Записан


Опыт растет в переходе на arx2017 и vs2015, спасибо за Ц.У.. Опять спрашиваю то, что не знаю. Как пройти очередную ошибку, где искать решение?

1>cls_base.cpp(1725): error C2678: binary ‘>>’: no operator found which takes a left-hand operand of type ‘VBaseFile’ (or there is no acceptable conversion)

  1. void cLwpolilineC::setZ(double z)

  2. {

  3. for(int i=0;i<arrPt.length();i++)

  4.                 arrPt[i].z = z;

  5.         normal = AcGeVector3d::kZAxis;

  6. }

  7. void cLwpolilineC::loadBin(VBaseFile &file)

  8. {

  9.         cContour::loadBin(file);

  10. int n;

  11.         file >> normal >> (int)isClose >> n;         //error on the second >> for vs2015


Записан


Тут я тебе ничем не помогу. Я понятия не имею что это за класс VBaseFile, у которого компилятор C++ не находит перегруженный оператор ‘>>’, принимающий в качестве параметра объекты классов AcGeVector3d и/или int


Записан


Засада. А какова природа данной ошибки. Опять несоответствие типов или что-то другое? Что в хелпе миграции на эту тему есть, если есть вообще? В VS2012 проблем не было.
Или еще более подробней можно объяснить. Ну увижу я этот класc, что в нем искать?  Что значит (or there is no acceptable conversion) перевод ясен, т.е. это только для VS2015 где конвертация типов изменилась? Где рыть?


Записан


А какова природа данной ошибки

Не знаю.

Опять несоответствие типов или что-то другое?

Вполне возможно.

Что в хелпе миграции на эту тему есть, если есть вообще?

С вероятностью 90% это не имеет никакого отношения к ObjectARX.

Ну увижу я этот класc, что в нем искать?

Искать operator >>(), смотреть есть ли он, какие параметры принимает и т.д. Не видя кода ничего подробнее сказать не могу.

« Последнее редактирование: 10-06-2016, 14:11:33 от Александр Ривилис »


Записан


скорей всего не хватает каких-то инклудов.  от студии к студии такое наблюдается. вряд ли изобретался велосипед с нуля (уж очень конструкция похожа на std::ifstream), так что скорей всего спасет вставка в начало файла чего-то типа (а может и всего сразу :) ):

  1. #include <string>

  2. #include <iostream>

  3. #include <vector>

  4. using namespace std;

ps: вообще-то, чтоб точно понять что это за ошибка, нужно знать, что из себя представляет класс VBaseFile. 


Записан


скорей всего не хватает каких-то инклудов.

Не помогло

ps: вообще-то, чтоб точно понять что это за ошибка, нужно знать, что из себя представляет класс VBaseFile.

Высылаю полный текст ошибки и сам класс чтобы понять точно ошибку. Надеюсь поможете. Непонятно почему в самом классе VS не находит ошибки?  Это так, вопрос для общего развития.


Записан


  • Печать

Страницы: [1] 2  Все   Вверх

Member Avatar

13 Years Ago

This mostly appears when you have not specified main to return a certain type, Though that is just in general , It would be better if you would post your code down.

main(){//Causes the error
int main(){//No Error,

Though that is pretty generalised, Hope its the same error,

Member Avatar


Ancient Dragon

5,243



Achieved Level 70



Team Colleague



Featured Poster


13 Years Ago

It would be helpful if you told us which line the error occurred on so that we don’t have to read the whole program to find out.

Member Avatar


JasonHippy

724



Practically a Master Poster


13 Years Ago

As Sky has mentioned, there are several potential causes of this error.
I think it’s most often related to incorrectly/ambiguously defined variables, function parameters or function return types.

From what I understand of this (I have encountered it before):
In MS’s attempts to make VS2005 more conformable to the standard, VS2005 onwards requires all variables, parameters and return types to be explicitly declared.

In previous editions of VS, the compiler would assume int for variables which were ambiguously defined…

Consider this as a random example:

for ( int i = 0; i < (const)(myVector.size()); i++ ) 
{
    // Do something....
}

QUICK NOTE: Assume that myVector is declared elsewhere as a std::vector!

in VS 2003 and earlier, the above code would compile correctly without errors or warnings, but in VS 2005 onwards you’ll get the C4430 error/warning message.

Now what was wrong with the above code?
Well, if you look at the for loop, particularly the conditional part, what do we see?

i<(const)(myVector.size());

From the first part of the for loop, We can see that i is declared as an int, but what about myVector.size() in the conditional part?? What’s going on there?

Well, the return value of the call to myVector.size() has been cast to const, (probably by some insanely overzealous member of the const-correctness brigade!), but what would that convert to? const what?

In previous versions of VS (2003 and earlier), the compiler would assume that int was implied, so the returned value would be cast to int (or const int in this example) and the for loop would work.

Note: The call to myVector.size() returns a size_t, not an int. So without ‘captain const’ performing his stupid cast and the compilers resultant assumption, the for loop would’ve probably failed to compile, as I believe int and size_t are incompatible for direct comparison!

For VS2005 onwards, the compiler will no longer make any assumptions in these sorts of cases and will quite correctly flag an error.

So in order to get the code in the example to compile in VS2005 onwards, you’d probably have to change the for loops declaration to be something like:

for ( int i = 0; i < (int)(myVector.size()); i++ ) 
{
    // Do something....
}

or perhaps (depending on what’s going to happen inside the body of the loop):

for ( size_t i = 0; i < myVector.size(); i++ ) 
{
    // Do something....
}

I can’t guarantee that the above info is absolutely 100% correct, but it’s what I’ve been led to believe…It worked for me! (but I have been known to be wrong from time to time!)

I also can’t guarantee that these are the only types of situations in which the error will be thrown, there may be other conditions where this particular error is caused!

Hope this is of some help!
Jas.

Member Avatar


Narue

5,707



Bad Cop



Team Colleague


13 Years Ago

>#include <winbase.h>
Remove that line. It’s superfluous anyway as windows.h correctly includes winbase.h.

Member Avatar


ArkM

1,090



Postaholic


13 Years Ago

After that place all system header includes in StdAfx.h (and remove them from .cpp files (after #include "StdAfx.h" )…

Понравилась статья? Поделить с друзьями:
  • Error c4235 nonstandard extension used asm keyword not supported on this architecture
  • Error c4065e type of input file
  • Error c3867 visual studio
  • Error c3861 strcpy identifier not found
  • Error c3861 rand