Reputation: 53
I'm having a ridiculously strange problem. When I try to run the program below, there's an error message that says: "error C2512: 'Record' : no appropriate default constructor available". And when I double-click it, it directs me to a precompiled read-only header file named "xmemory0". Do they expect me to change a read-only file? Here's the segment of code in the file it directs me to:
void construct(_Ty *_Ptr)
{ // default construct object at _Ptr
::new ((void *)_Ptr) _Ty(); // directs me to this line
}
Here's the program:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int NG = 4; // number of scores
struct Record
{
string name; // student name
int scores[NG];
double average;
// Calculate the average
// when the scores are known
Record(int s[], double a)
{
double sum = 0;
for(int count = 0; count != NG; count++)
{
scores[count] = s[count];
sum += scores[count];
}
average = a;
average = sum / NG;
}
};
int main()
{
// Names of the class
string names[] = {"Amy Adams", "Bob Barr", "Carla Carr",
"Dan Dobbs", "Elena Evans"};
// exam scores according to each student
int exams[][NG]= { {98, 87, 93, 88},
{78, 86, 82, 91},
{66, 71, 85, 94},
{72, 63, 77, 69},
{91, 83, 76, 60}};
vector<Record> records(5);
return 0;
}
Upvotes: 1
Views: 337
Reputation: 177471
You don't have a default constructor for Record, and vector<Record> records(5)
requires one. Visual Studio is notoriously unhelpful with its template error messages. If you go to the Output tab as opposed to the Errors tab, you'll see a cascade of error messages, the first of which is the one you have found, and the last of which should point to your vector
line.
If you click on the error message, then switch to the Output tab, scroll down through the lengthy error message until you reach a reference to your own code, then figure out the fix.
Here's the complete error message. Line 44 in my source is your vector
line:
D:\dev12\VC\INCLUDE\xmemory0(588) : error C2512: 'Record' : no appropriate default constructor available
D:\dev12\VC\INCLUDE\xmemory0(587) : while compiling class template member function 'void std::allocator<_Ty>::c
nstruct(_Ty *)'
with
[
_Ty=Record
]
D:\dev12\VC\INCLUDE\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Ty>:
construct(_Ty *)' being compiled
with
[
_Ty=Record
]
D:\dev12\VC\INCLUDE\type_traits(572) : see reference to class template instantiation 'std::allocator<_Ty>' bein
compiled
with
[
_Ty=Record
]
D:\dev12\VC\INCLUDE\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being c
mpiled
with
[
_Alloc=std::allocator<Record>
]
z.cpp(44) : see reference to class template instantiation 'std::vector<Record,std::allocator<_Ty>>' being compi
ed
with
[
_Ty=Record
]
Upvotes: 2