|
Use your development environment (VS or whatever) to check that there is a #define for each the following:
NODISCARD
_Check_return_
In
_CSTD
And if you're using C instead of C++, noexcept could be the problem. But I can't say, because I only write C++.
EDIT: type 'int' unexpected suggests that the caller is passing an int , not a float .
|
|
|
|
|
There are plenty of _Check_return_ statements that work.
If there is something wrong with the calling function, I should get a compile error when compiling the cpp file where the function is called? This is an error from inside the include file cmath.h.
Three errors reported, underscore is the highlighted error indication.
Line 210
_NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ {
return _CSTD roundf(_Xx);
}
Line 446
_NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ {
return _CSTD roundl(_Xx);
}
Line 663
_GENERIC_MATH1(round)
It seems I am not allowed to alter any include file, so I can not experiment with commenting the functions out, etc.
|
|
|
|
|
Check if round is also defined somewhere else, and check that _GENERIC_MATH1 is actually defined. Beyond that, I don't know.
|
|
|
|
|
I would be inclined to look at the preprocessor output to see what all of those non-standard "types" are.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi,
I am going to point out that you are almost certainly looking at the wrong code location. The C2062 error usually really does mean the 3 letters 'int' were unexpected while parsing the code.
Look around for an int that is declared wrong.
|
|
|
|
|
Is that the full text of the error message? Also what are the few lines either side of that definition?
|
|
|
|
|
Your compiler should have an option to send the output of the preprocessor into a file. Using Visual C/C++, this option is /P, and the output file has an extension of .i .
Run your code through this, and look for cmath.h in the .i file. Then look for the definition of the round() function. You will see what the compiler thinks the round() function is, and your problem should then be obvious.
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.
-- 6079 Smith W.
|
|
|
|
|
Hi and thanks for all help.
When I put
#include <cmath>
right under #include stdafx.h it compiled. Don't ask me exactly why. It may be a conflict between math.h and cmath that was solved in this way.
Regards, Haakon S.
|
|
|
|
|
So...
You said that your compiler gave you an error in cmath.h
Haakon S. wrote: For this line in cmath.h I get an error: Which you solved... "by including cmath.h"

|
|
|
|
|
I honestly don't know what is going on.
Some files had #include <math.h>. Removing this did't help. It reported error in cmath anyway.
When googling "cmath error c2062" I see that others have had the same problem.
Anyway, it seems that I have found the solution.
|
|
|
|
|
Ok C++ is not mt my main language so please bear with me.
For my question I will use this class
class BillingDates
{
public:
BillingDates(std::string InputFile);
void ProcessDates();
rapidjson::Document doc;
std::string InputFile;
std::string YearStartDate;
std::string YearEndDate;
std::string BBFDate;
std::string BillIssueDate;
std::string BillIssueDateLong;
int CurrentFinancialYear = 0;
std::ifstream InputStream;
};
And in my main program I declare a pointer and an object to the class thus
BillingData *bData;
BillingData bData2;
I can then create my pointer so
bData = new BillingDates("path to my file");
how can I create an instance for bData2 ?
I know I can do it like this
BillingData bData2("path to my file");
but that will create a new var and not use my previously declared var.
Hope this makes sense
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
If your code looks exactly like posted, compiler will slap you with an error on bData2 line because you don't have a default constructor. You can:
1. Modify the constructor to default to an empty string: BillingDates(std::string InputFile = std::string()) and handle the case when InputFile is the empty string.
2. Create an additional default constructor: BillingDates()
If you need to move data from bData to bData2 you might need a copy constructor: BillingDate (const BillingDate& other) .
Mircea
|
|
|
|
|
Hi and thanks for replying but the problem I have is I don't know the path to my input file until later in the program
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
In that case have a default constructor for initialization and add a function BillingDates::Open (std::string& file) that gets called when you have the path to your file.
You might also need something like bool BillingDates::IsOpen() const to check the state of the object.
Mircea
|
|
|
|
|
Have you tried:
BillingDates bData2("");
BillingDates* bData = &bData2;
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi and thanks for replying but the problem I have is I don't know the path to my input file until later in the program
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
Then add an empty constructor and a "setter" method to the class.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
If they need to be the same instance, versus a copy, consider using std::shared_ptr for both.
|
|
|
|
|
|
Hi there, I don't think I'm explaining what is confusing me so I'll try again.
If I define a class object in a C# program I can instantiate it like so
Sample of the top of my head code
namespace Test
{
public class Dummy
{
string Path {get;set;}
Public Dummy(string Path)
{
this.Path = Path;
}
}
class Program
{
Dummy dummy {get;set;}
[STAThread]
static void Main()
{
Program p = new Program();
p.dummy = new Dummy("MyPath");
}
}
}
In C++ I can only create it like this if I make the dummy variable a pointer ( which is not a problem but I'd like to know how to do it the other way) I'm sure this must be doable. Thanks for everyones help so far.
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
Quote: which is not a problem but I'd like to know how to do it the other way There isn't 'the other way' (AFAIK).
In C++ , using new , you get a pointer. Moreover you need to handle the cleanup of the dynamically allocated memory:
#include <iostream>
using namespace std;
namespace Test {
class Dummy
{
string path;
public:
Dummy(string path) : path {path}{}
string get (){return path;}
void set(string newpath){ path = newpath; }
};
class Program
{
Dummy * dummy;
public:
static void main()
{
Program * p = new Program();
p->dummy = new Dummy("MyPath");
cout << p->dummy->get() << "\n";
delete p->dummy;
delete p;
}
};
}
int main()
{
Test::Program::main();
}
You may write the Program destructor to ammeliorate the code, but cleanup is unavoidable.
If you can initialize at once your objects then you could use the stack and the code would be nicer:
#include <iostream>
using namespace std;
namespace Test {
class Dummy
{
string path;
public:
Dummy(string path) : path {path}{}
string get (){return path;}
void set(string newpath){ path = newpath; }
};
class Program
{
Dummy dummy;
public:
Program( Dummy dummy):dummy{dummy}{}
static void main()
{
Program p { Dummy{ "MyPath" } };
cout << p.dummy.get() << "\n";
}
};
}
int main()
{
Test::Program::main();
}
Finally smart pointers allows you to make the two steps initiazlization without the hassle of manual cleanup, e.g.
#include <iostream>
#include <memory>
using namespace std;
namespace Test {
class Dummy
{
string path;
public:
Dummy(string path) : path {path}{}
string get (){return path;}
void set(string newpath){ path = newpath; }
};
class Program
{
unique_ptr<Dummy> dummy;
public:
static void main()
{
Program p {};
p.dummy = make_unique<Dummy>("MyPath");
cout << p.dummy->get() << "\n";
}
};
}
int main()
{
Test::Program::main();
}
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
In C++, you can define variables at any point, not just at the beginning of the block. Define bData2 only at the point that file name is known.
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.
-- 6079 Smith W.
|
|
|
|
|
Correcting the mis-spellings you have:
BillingDates *bData; BillingDates bData2;
In the above code bData is a pointer that has not yet been initialised, so it does not actually point to anything. bData2 is an actual instance of the class, or would be if you had included the no-parameters constructor to get it to compile.
But I am not sure what you are trying to do with them. You could add the following line of code at some point:
bData = new BillingDates("someFilename");
but then what? And it is still not clear what bdata2 is supposed to be for.
|
|
|
|
|
Hi Richard, sorry about the spelling mistakes I'm actually working on multiple project so that was a cut'n past jobbie
I know I can do this
bData = new BillingDates("someFilename");
but how can I create an instance of the class using bData2 ( not in the declaration of the variable I know how to do that ) as I said earlier in C# ypu can declare like
someclass someclassob {get;set;}
Then create the instance
someclassobj = new someclass("Parameter goes here");
even though you didn't specify a parameter in the declaration of someclassobj .
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
pkfox wrote: ypu can declare like
someclass someclassob {get;set;}
That's a new one on me, I must look it up.
As I mentioned you need to add a parameterless constructor to the class, and some method that allows you to add a filename at runtime. something like:
class BillingDates
{
public:
BillingDates();
BillingDates(std::string InputFile);
void addFile(std::string InputFile);
void ProcessDates();
};
You can then write:
BillingDates *bData;
BillingDates bData2;
bData2.addFile("your file name here");
bData = &bData2;
But I really don't know why you need any of that. All you really need is:
BillingDates *bData;
bData = new BillingDates("your file name here");
Does that make (any) sense?
|
|
|
|