SoloMael
SoloMael

Reputation: 53

error C2512 in precompiled header file?

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

Answers (1)

Mark Tolonen
Mark Tolonen

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

Related Questions