c++ Primer (fifth edition) and Microsoft Visual Studio

So I am working through this book but Visual studio is giving me a headache with regards lround. The error I get is C2375 'lround' : redefinition; different linkage.

This is the code

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#include "stdafx.h"
#include "Sales_item.h"
#include <iostream>


int main()
{
	Sales_item item1, item2;
	std::cin >> item1 >> item2;

	if (item1.isbn() == item2.isbn())
	{
		std::cout << item1 + item2 << std::endl;
		return 0;
	}
	else
	{
		std::cerr << "Data must refer to the same ISBN" << std::endl;
		return -1;
	}
}


Sales_item.h

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef SALESITEM_H
// we're here only if SALESITEM_H has not yet been defined 
#define SALESITEM_H

#include "Version_test.h" 

// Definition of Sales_item class and related functions goes here
#include <iostream>
#include <string>

class Sales_item {
// these declarations are explained section 7.2.1, p. 270 
// and in chapter 14, pages 557, 558, 561
friend std::istream& operator>>(std::istream&, Sales_item&);
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
friend bool operator<(const Sales_item&, const Sales_item&);
friend bool 
operator==(const Sales_item&, const Sales_item&);
public:
    // constructors are explained in section 7.1.4, pages 262 - 265
    // default constructor needed to initialize members of built-in type
#if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
    Sales_item() = default;
#else
    Sales_item(): units_sold(0), revenue(0.0) { }
#endif
    Sales_item(const std::string &book):
              bookNo(book), units_sold(0), revenue(0.0) { }
    Sales_item(std::istream &is) { is >> *this; }
public:
    // operations on Sales_item objects
    // member binary operator: left-hand operand bound to implicit this pointer
    Sales_item& operator+=(const Sales_item&);
    
    // operations on Sales_item objects
    std::string isbn() const { return bookNo; }
    double avg_price() const;
// private members as before
private:
    std::string bookNo;      // implicitly initialized to the empty string
#ifdef IN_CLASS_INITS
    unsigned units_sold = 0; // explicitly initialized
    double revenue = 0.0;
#else
    unsigned units_sold;  
    double revenue;       
#endif
};

// used in chapter 10
inline
bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) 
{ return lhs.isbn() == rhs.isbn(); }

// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);

inline bool 
operator==(const Sales_item &lhs, const Sales_item &rhs)
{
    // must be made a friend of Sales_item
    return lhs.units_sold == rhs.units_sold &&
           lhs.revenue == rhs.revenue &&
           lhs.isbn() == rhs.isbn();
}

inline bool 
operator!=(const Sales_item &lhs, const Sales_item &rhs)
{
    return !(lhs == rhs); // != defined in terms of operator==
}

// assumes that both objects refer to the same ISBN
Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this;
}

// assumes that both objects refer to the same ISBN
Sales_item 
operator+(const Sales_item& lhs, const Sales_item& rhs) 
{
    Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
    ret += rhs;           // add in the contents of (|rhs|) 
    return ret;           // return (|ret|) by value
}

std::istream& 
operator>>(std::istream& in, Sales_item& s)
{
    double price;
    in >> s.bookNo >> s.units_sold >> price;
    // check that the inputs succeeded
    if (in)
        s.revenue = s.units_sold * price;
    else 
        s = Sales_item();  // input failed: reset object to default state
    return in;
}

std::ostream& 
operator<<(std::ostream& out, const Sales_item& s)
{
    out << s.isbn() << " " << s.units_sold << " "
        << s.revenue << " " << s.avg_price();
    return out;
}

double Sales_item::avg_price() const
{
    if (units_sold) 
        return revenue/units_sold; 
    else 
        return 0;
}
#endif


Version_test.h

1
2
3
4
5
6
7
8
9
10
#endif  // ends compiler version check

#ifndef LROUND
inline long lround(double d)
{
    return (d >= 0) ?  long(d + 0.5) : long(d - 0.5);
}
#endif

#endif  // ends header guard 


Please note the only code that's mine is from the main.cpp the other code is all downloaded from the books site and is the authors coding. And at the stage in the book I am in (the start) most of whats in Sales_item.h and Version_test.h is not covered yet.

With thanks
> C2375 'lround' : redefinition; different linkage.
¿is that the full error message? ¿doesn't it mention some files and line number?
¿a "first defined here" or "previously defined here"?

Also, show your build command. ¿are you trying to compile the headers?


> the other code is all downloaded from the books site and is the authors coding.
¿could you provide a link to the download it, please?


Try to change `lround()' name (for example to `lround_()').
If the error changes and complains about the new name `lround_()', then you probably have a misconfiguration.
If the error disappears, then that header may be wrongly defined, and you could probably comment out that function.
closed account (E0p9LyTq)
There is an lround() function in the C Library. Maybe you need to #include <cmath> or #include<ctgmath>?
Last edited on
Sorry it took me a while to get back to you all. I feel bad as you took the time to look into this for me, my problem was my young kids stopping me continuing my learning.

ok it also has:

linkage specification is incompatible with previous "lround" (declared at line 74 of "c:\Users\Ordanska\Desktop\c++ book\chapter 1\ConsoleApplication1\ConsoleApplication1\Version_test.h") ConsoleApplication1 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtgmath.h 201

and:

linkage specification is incompatible with previous "lround" (declared at line 74 of "c:\Users\Ordanska\Desktop\c++ book\chapter 1\ConsoleApplication1\ConsoleApplication1\Version_test.h") ConsoleApplication1 c:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\math.h 509


The link for the downloads is
http://www.informit.com/store/c-plus-plus-primer-9780321714114
Ok update on this, it was my mistake I didn't create an empty project using Microsoft visual studio and this caused problems with all the files...


Well at least I learnt. Just wish to say thanks to those that replied
Topic archived. No new replies allowed.