typedef a specialized nested template [duplicate] - c++

This question already has answers here:
Where and why do I have to put the "template" and "typename" keywords?
(8 answers)
Closed 6 years ago.
I'm trying to compile some old C++ code which doesn't seem to be valid C++ anymore (VS2008 to VS2015). I've managed to narrow the problem down to something which looks like this.
class Any { };
class Parent
{
template < typename anyT>
class Child { };
};
template< typename parentT >
class Fail
{
typedef typename parentT::Child<Any> ChildT; // 2 errors
typename ChildT _child; // 2 errors
};
I get this compiler error from Visual Studio 2015.
Error C2059 syntax error: '<' TemplateTest d:\programming\templatetest\example.h 12
Error C2238 unexpected token(s) preceding ';' TemplateTest d:\programming\templatetest\example.h 12
Error C3646 '_child': unknown override specifier TemplateTest d:\programming\templatetest\example.h 13
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int TemplateTest d:\programming\templatetest\example.h 13

Where and why do I have to put the “template” and “typename” keywords?
typedef typename parentT::template Child<Any> ChildT;
ChildT _child;

Related

Compilation error upgrading from VS 2008 to VS 2015

I get errors compiling the code below when ugrading from VS 2008 to VS2015. The code is from the com4j project. Help wanted. Thanks!
syntax error: missing ';' before '<' missing type specifier
int assumed. Note: C++ does not support default-int
'array': ambiguous symbol
unexpected token(s) preceding ';'
Code:
// Class to marshal SAFEARRAY to Java multi dimensional array
//
// itemType : array item type
// XDUCER : converter for each array item
template < VARTYPE itemType, class XDUCER >
class ToJavaMultiDimlArrayMarshaller {
typedef array::Array<typename XDUCER::JavaType> JARRAY; // Errors here
typedef SAFEARRAY* NativeType;
typedef jarray JavaType;
What does VARTYPE stand for? Is it a macro? Replacing with class or typename may help

CGAL doesn't recognize type

For my thesis project I am dependent on a bunch of CGAL code written by another student a year ago. Unfortunately, I can't get the code to compile due to errors. These errors were probably not experienced by the previous student, so they probably are more related to my setup than the code itself, but I have no idea what the direct cause is.
The errors are in the file CCBSegmentCalculator.h. The code is as follows:
#pragma once
#include "bezier_arrangement.h"
//Circulates around a PL_Arrrangement CCB, visiting the points between the segments that make up the CCB
// (so smaller-scale than the build-in iterator that only visits the PL_Arrangement vertices)
// --- Could be used in more places than it is now, e.g., in the SVGHandler
class CCBSegmentCirculator
{
public:
CCBSegmentCirculator(PL_Arrangement::Ccb_halfedge_const_circulator ccbCirculator);
const CCBSegmentCirculator& next();
PL_Point operator*();
PL_Point get(); // same as operator*
bool operator==(const CCBSegmentCirculator &other) const;
private:
const PL_Arrangement::Ccb_halfedge_const_circulator halfedgesBegin;
PL_Arrangement::Ccb_halfedge_const_circulator halfedge;
//Depending on this boolean ...
bool forward;
//... we are either using these forward iterators ...
// -> in which case the 'current' point is segment.source
Polyline::Segment_const_iterator segment;
Polyline::Segment_const_iterator segmentEnd;
//... or these reverse iterators
// -> in which case the 'current' point is segmentReverse.target
Polyline::Segment_const_reverse_iterator segmentReverse;
Polyline::Segment_const_reverse_iterator segmentReverseEnd;
void initHalfedge();
};
The file "bezier_arrangement.h" has the following code:
#pragma once
#include <CGAL/Cartesian.h>
#include <CGAL/CORE_algebraic_number_traits.h>
#include <CGAL/Arr_Bezier_curve_traits_2.h>
#include <CGAL/Arrangement_2.h>
#include <CGAL/Arrangement_with_history_2.h>
#include <CGAL/Arr_extended_dcel.h>
#include <CGAL/Iso_rectangle_2.h>
#include <CGAL/Arr_walk_along_line_point_location.h>
#include <CGAL/Arr_observer.h>
//#include <CGAL/basic.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Arr_segment_traits_2.h>
#include <CGAL/Arr_polyline_traits_2.h>
struct FaceData
{
FaceData ()
{
colored = false;
solved = false;
};
bool colored = false;
bool solved = false;
};
//// Bezier curve traits ////
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
typedef Nt_traits::Rational NT;
typedef Nt_traits::Rational Rational;
typedef Nt_traits::Algebraic Algebraic;
//Simple_cartesian = for easier debugging, no ref counting, values directly in objects
typedef CGAL::Cartesian<Rational> Kernel;
typedef CGAL::Cartesian<Algebraic> Alg_kernel;
//typedef Kernel::Point_2 Rat_Point;
typedef CGAL::Arr_Bezier_curve_traits_2<Kernel, Alg_kernel, Nt_traits> Traits;
typedef Traits::Curve_2 Bezier;
typedef Traits::Point_2 Point;
typedef Kernel::Iso_rectangle_2 BoundingBox;
typedef CGAL::Arr_face_extended_dcel<Traits, FaceData> Dcel;
typedef CGAL::Arrangement_with_history_2<Traits, Dcel> Arrangement; //Not really used anymore, because of crashes/problems/bugs
//// Polyline traits ////
// Instantiate the traits class using a user-defined kernel
// and Segment_traits_2.
typedef CGAL::Exact_predicates_exact_constructions_kernel PL_Kernel;
typedef CGAL::Arr_segment_traits_2<PL_Kernel> Segment_traits;
typedef CGAL::Arr_polyline_traits_2<Segment_traits> PL_traits;
// Identical instantiation can be achieved using the default Kernel:
// typedef CGAL::Arr_polyline_traits_2<> Geom_traits_2;
typedef PL_traits::Point_2 PL_Point;
typedef PL_traits::Segment_2 Segment;
typedef PL_traits::Curve_2 Polyline;
typedef CGAL::Arr_extended_dcel<PL_traits, bool/*not used*/, double, FaceData> PL_Dcel;
typedef CGAL::Arrangement_with_history_2<PL_traits, PL_Dcel> PL_Arrangement; //This is now the only type of arrangement that we actually use
//Handles
typedef PL_Arrangement::Vertex_const_handle Vertex_handle;
typedef PL_Arrangement::Halfedge_const_handle Halfedge_handle;
typedef PL_Arrangement::Curve_const_handle Curve_handle;
//Point location
typedef CGAL::Arr_walk_along_line_point_location<PL_Arrangement> PointLocationAlg;
typedef CGAL::Arr_point_location_result<PL_Arrangement>::Type PointLocationResult;
//Less function to use for (vertex/halfedge/face) handle sets
template <class Handle> struct HandleLess
{
bool operator()(Handle a, Handle b)
{
return (a.ptr() - b.ptr() < 0);
}
};
typedef std::set<Vertex_handle, HandleLess<Vertex_handle>> VertexHandleSet;
//Arrangement observer that keeps the face colours correct
class FaceColorObserver : public CGAL::Arr_observer<PL_Arrangement>
{
private:
bool coloredBeforeMerge;
public:
FaceColorObserver(PL_Arrangement& arrangement) :
CGAL::Arr_observer<PL_Arrangement>(arrangement)
{}
virtual void after_split_face(Face_handle oldFace, Face_handle newFace, bool)
{
newFace->data().colored = oldFace->data().colored;
}
virtual void before_merge_face(Face_handle face1, Face_handle face2, Halfedge_handle)
{
//The assumption is that only same-color faces get merged
CGAL_precondition(face1->data().colored == face2->data().colored);
coloredBeforeMerge = face1->data().colored;// && face2->data().colored;
}
virtual void after_merge_face(Face_handle newFace)
{
newFace->data().colored = coloredBeforeMerge;
}
};
//Arrangement of line segments
typedef CGAL::Arrangement_2<Segment_traits> Seg_Arrangement;
The errors I am getting have to do with the fact that CGAL either thinks the defined Polyline type doesn't have a member Segment_const_iterator, or it fails to properly recognize the type at all. I'm not sure, due to it being translated into an internal CGAL type. The errors I get are:
Error C2039 'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>' CurvedNonograms c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\curvednonograms\ccbsegmentcirculator.h 39
repeated for the lines containing the definitions of segment,segmentEnd,segmentReverse,and segmentReverseEnd.
According to the documentation, Curve_2 should have a definition for Segment_const_iterator.
Once again, the error is probably not in the code itself, but in my build/linking of CGAL somewhere. Reinstalling CGAL did not help, and I'm pretty sure I have it linked in the relevant places, but this part of building software isn't really my strong suit so I may not know all the relevant spots.
edit: the very first error given in the output is:
c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\c‌​urvednonograms\svgha‌​ndler.cpp(94): error C2039: 'begin_segments': is not a member of 'CGAL::_Curve_data_ex<CGAL::internal::X_monotone_polycurve_2‌​<CGAL::Arr_segment_2‌​<Kernel_>,CGAL::Poin‌​t_2<Kernel_>>,CGAL::‌​_Unique_list<Data_>>‌​' 2> with 2> [ 2> Kernel_=PL_Kernel, 2> Data_=CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<PL_Ker‌​nel>,CGAL::Point_2<C‌​GAL::Epeck>> * 2> ]
This is in a different code file than the one shown above, as there are more errors in the code, but all of them seem to stem from similar problems. there are also some warnings of the form:
2>c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(313): warning C4503: '__LINE__Var': decorated name length exceeded, name was truncated
Adding the CCBSegmentCalculator.h to a different project to compile only it gives the following errors:
Severity Code Description Project File Line Suppression State
Error (active) class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_iterator" CurvedNonogramsGenerator c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h 28
Error (active) class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_iterator" CurvedNonogramsGenerator c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h 29
Error (active) class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_reverse_iterator" CurvedNonogramsGenerator c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h 32
Error (active) class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_reverse_iterator" CurvedNonogramsGenerator c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h 33
Error C2039 'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>' CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 28
Error C3646 'segment': unknown override specifier CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 28
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 28
Error C2039 'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>' CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 29
Error C3646 'segmentEnd': unknown override specifier CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 29
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 29
Error C2039 'Segment_const_reverse_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>' CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 32
Error C3646 'segmentReverse': unknown override specifier CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 32
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 32
Error C2039 'Segment_const_reverse_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>' CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 33
Error C3646 'segmentReverseEnd': unknown override specifier CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 33
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int CurvedNonogramsGenerator c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h 33
Replace Segment_const_iterator and Segment_const_reverse_iterator with Subcurve_const_iterator and Subcurve_const_reverse_iterator, respectively.
You probably need to replace begin_segments() and end_segments() with subcurves_begin() and subcurves_end(), respectively.
In version (I think) 4.2 we made significant changes to the code. One of the changes was extending the definition of the polylines supported by the arr_polyline_traits_2 traits class. Now, a polyline can be a chain of linear curves that are not necessarily segments. For example, it can have one or two rays as the first and last pieces, or even a line. (Officially, a piece of the polyline can be any curve that can be constructed from two points).

C++ constexpr error statement showing error [duplicate]

This question already has answers here:
constexpr not compiling in VC2013
(4 answers)
Closed 9 years ago.
Please help me with this error.
I am trying to make a sample that explains constexpr keyword in c++. I am using Visual Studio 2013.
Following is the code of my cpp file.
#include <iostream>
#include <stdexcept>
const int sampleconstant = 5;
constexpr int constTest(void)
{
return sampleconstant;
}
int main()
{
std::cout << constTest();
getchar();
return 0;
}
This shows compile time error as follows:
Error 1 error C2144: syntax error : 'int' should be preceded by ';'
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
I may be doing something silly here. But really can't figure out this error. Code looks ok to me. If any one can help me with error please help.
As already told you, it is not supported on VS.
You can see at this link a list of featured supported by the compilers: http://wiki.apache.org/stdcxx/C++0xCompilerSupport

Error C2059: syntax error 'constant' [duplicate]

This question already has answers here:
Why am I getting "error: expected '}'" in C++ but not in C?
(3 answers)
Closed 9 years ago.
I have the following code in a header file:
enum {false,true};
and I have my main function in main.c. if I change the extention to main.cpp
I get the following error:
Error C2059: syntax error 'constant'
Im using visual c++, any Idea why`?
true and false are keywords representing constant values in C++. You cannot use them to name things such as enum values.
As an example, the following would compile
enum { false_, true_ };
int main() {}
false and true are reserve words in C++. You can't redefine it as variable.

error C2061 while passing vector as an argument [duplicate]

This question already has answers here:
C++: Syntax error C2061: Unexpected identifier
(5 answers)
Closed 9 years ago.
I'm getting this error:
1>b:\projects\c++\wolvesisland\wolvesisland\wolvesisland\board.h(22): error C2061: syntax error : identifier 'vector'
while trying to pass vector as an argument.
(it's about function move())
Code:
Board.h
#pragma once
#include <vector>
enum field_state {is_wolfm, is_wolff, is_rabbit, is_bush, is_nobody};
struct state{
field_state field;
int number;
};
class Board
{
private:
state island[20][20];
public:
Board(void);
~Board(void);
void fill(int,int,int,int, vector<LivingForm*>*);
state get_island(int,int);
void set_state(int,int,field_state,int);
};
and the function declaration in Board.cpp:
void Board::fill(int rabbit,int wolfm,int wolff,int bush,vector <LivingForm*> *creatures)
vector lives in the std namespace, so you need to refer to ut as std::vector:
void fill(int,int,int,int, std::vector<LivingForm*>*);
// ^^^