473,289 Members | 1,963 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,289 software developers and data experts.

Problems With Templates

Hello there,

I have a school project and I have to finish it soon.

I have to implement B+ Tree for the project.

I have TreeNode template class. That will be used to hold keys in the tree
index.
I have LeafNode template class derivered from TreeNode. That will be used to
hold keys and values in leaf.

Everything seems fine but it does not compile under MS.Net and gcc. It
compiles Dev-C++ but linker can not find Insert function and gives error.

I have checked many resources but I could not find the error. I would be
glad if you could explain me what is wrong.

Errors I get
TreeNode.h(5): error C2059: syntax error : '<' (The same line with
template)
TreeNode.h(5): error C2143: syntax error : missing '{' before '<' (The same
line with template)
TreeNode.c(3): error C2059: syntax error : '<'

main.c(9): error C2059: syntax error : 'type'

and the list goes like this.

I would be glad if you could explain me what is wrong.
////////////// TreeNode.h////////////////
////////////// TreeNode.h////////////////
////////////// TreeNode.h////////////////
#ifndef __TREE_NODE__

#define __TREE_NODE__

template <class KeyType, class ValType, int SIZE>

class TreeNode

{

public:

TreeNode() : nCount(0)

{};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,

TreeNode<KeyType, ValType, SIZE> *&LeftChild,

TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:

int nCount;

KeyType e_Keys[SIZE];

TreeNode<KeyType, ValType, SIZE> *e_Childs[SIZE];

};

#endif
////////////// LeafNode.h////////////////
////////////// LeafNode.h////////////////
////////////// LeafNode.h////////////////

#include "TreeNode.h"

#ifndef __LEAF_NODE__

#define __LEAF_NODE__

template <class KeyType, class ValType, int SIZE>

class LeafNode : public TreeNode<KeyType, ValType, SIZE>

{

public:

LeafNode()

{

nCount = 0;

};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,

TreeNode<KeyType, ValType, SIZE> *&LeftChild,

TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:

ValType e_Vals[SIZE];

};

#endif

////////// Main.c for testing //////////////////

////////// Main.c for testing //////////////////

////////// Main.c for testing //////////////////

int main(int argc, char *argv[])

{

int a, b, c, d;

LeafNode<int, int, 7> TestNode;

TreeNode<int, int, 7> *e, *f;

TestNode.Insert(10, 10, a, e, f);

return 0;

}

Tayfun Ozdemir
Oct 24 '05 #1
10 1663
I can send you all of my program if that helps.
Sincerely.
Tayfun Özdemir.
"Tayfun Özdemir" <NO****@NOSPAM.COM>, haber iletisinde şunları
yazdı:8M******************@fe08.news.easynews.com. ..
Hello there,

I have a school project and I have to finish it soon.

I have to implement B+ Tree for the project.

I have TreeNode template class. That will be used to hold keys in the tree
index.
I have LeafNode template class derivered from TreeNode. That will be used
to hold keys and values in leaf.

Everything seems fine but it does not compile under MS.Net and gcc. It
compiles Dev-C++ but linker can not find Insert function and gives error.

I have checked many resources but I could not find the error. I would be
glad if you could explain me what is wrong.

Errors I get
TreeNode.h(5): error C2059: syntax error : '<' (The same line with
template)
TreeNode.h(5): error C2143: syntax error : missing '{' before '<' (The
same line with template)
TreeNode.c(3): error C2059: syntax error : '<'

main.c(9): error C2059: syntax error : 'type'

and the list goes like this.

I would be glad if you could explain me what is wrong.
////////////// TreeNode.h////////////////
////////////// TreeNode.h////////////////
////////////// TreeNode.h////////////////
#ifndef __TREE_NODE__

#define __TREE_NODE__

template <class KeyType, class ValType, int SIZE>

class TreeNode

{

public:

TreeNode() : nCount(0)

{};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,

TreeNode<KeyType, ValType, SIZE> *&LeftChild,

TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:

int nCount;

KeyType e_Keys[SIZE];

TreeNode<KeyType, ValType, SIZE> *e_Childs[SIZE];

};

#endif
////////////// LeafNode.h////////////////
////////////// LeafNode.h////////////////
////////////// LeafNode.h////////////////

#include "TreeNode.h"

#ifndef __LEAF_NODE__

#define __LEAF_NODE__

template <class KeyType, class ValType, int SIZE>

class LeafNode : public TreeNode<KeyType, ValType, SIZE>

{

public:

LeafNode()

{

nCount = 0;

};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,

TreeNode<KeyType, ValType, SIZE> *&LeftChild,

TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:

ValType e_Vals[SIZE];

};

#endif

////////// Main.c for testing //////////////////

////////// Main.c for testing //////////////////

////////// Main.c for testing //////////////////

int main(int argc, char *argv[])

{

int a, b, c, d;

LeafNode<int, int, 7> TestNode;

TreeNode<int, int, 7> *e, *f;

TestNode.Insert(10, 10, a, e, f);

return 0;

}

Tayfun Ozdemir

Oct 24 '05 #2
Tayfun Özdemir wrote:
Hello there,

I have a school project and I have to finish it soon.

I have to implement B+ Tree for the project.

I have TreeNode template class. That will be used to hold keys in the tree
index.
I have LeafNode template class derivered from TreeNode. That will be usedto
hold keys and values in leaf.

Everything seems fine but it does not compile under MS.Net and gcc. It
compiles Dev-C++ but linker can not find Insert function and gives error.

I have checked many resources but I could not find the error. I would be
glad if you could explain me what is wrong.

Errors I get
TreeNode.h(5): error C2059: syntax error : '<' (The same line with
template)
TreeNode.h(5): error C2143: syntax error : missing '{' before '<' (The same
line with template)
TreeNode.c(3): error C2059: syntax error : '<'

main.c(9): error C2059: syntax error : 'type'


Code compiles fine here, but I cannot link because some files are
missing.

1) .c files are usually interpreted as being C files so your system may
compile them with a C compiler. Make them .cpp files.
2) most current compilers cannot compile templates if their member
functions are not defined inline (in the class). That`s probably why
dev-c++ is failing at link-time.
Jonathan

Oct 24 '05 #3
Thank you so Jonathan. You were right. Some files were named "c" instead of
"cpp" :-).

It compiles fine now. But I get linker error. I would be very glad if you
can explain what is wrong with my project. I have checked function
parameters and return value. They all match each other. I could not find the
error.

////// TreeNode.h ///////
////// TreeNode.h ///////
////// TreeNode.h ///////

#ifndef __TREE_NODE__
#define __TREE_NODE__
template <class KeyType, class ValType, int SIZE>
class TreeNode
{
public:
TreeNode() : nCount(0)
{};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild);
protected:
int nCount;
KeyType e_Keys[SIZE];
TreeNode<KeyType, ValType, SIZE> *e_Childs[SIZE];
};

#endif


////// TreeNode.cpp ///////
////// TreeNode.cpp ///////
////// TreeNode.cpp ///////

#include "TreeNode.h"

template <class KeyType, class ValType, int SIZE>
void TreeNode<KeyType, ValType, SIZE>::Insert(KeyType Key, ValType Val,
KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild)
{
return;
}
////// LeafNode.h ///////
////// LeafNode.h ///////
////// LeafNode.h ///////

#include "TreeNode.h"

#ifndef __LEAF_NODE__
#define __LEAF_NODE__

template <class KeyType, class ValType, int SIZE>
class LeafNode : public TreeNode<KeyType, ValType, SIZE>
{
public:

LeafNode()
{
nCount = 0;
};
virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:
ValType e_Vals[SIZE];
};
#endif


////// LeafNode.cpp ///////
////// LeafNode.cpp ///////
////// LeafNode.cpp ///////

#include "LeafNode.h"

template <class KeyType, class ValType, int SIZE>
void LeafNode<KeyType, ValType, SIZE>::Insert(KeyType Key, ValType Val,
KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild)
{
int i = nCount;

// Shift values in the list by one until we find the spot
while (i != 0 && e_Keys[i - 1] > Key) {
e_Keys[i] = e_Keys[i - 1];
e_Vals[i] = e_Vals[i - 1];
i--;
}

// We are on the spot add new value to the list
e_Keys[i] = Key;
e_Vals[i] = Value;
nCount++;

// Check if we are full and are ready to split
if (nCount == SIZE) {
LeafNode<KeyType, ValType, SIZE> *Right = new LeafNode<KeyType,
ValType, SIZE>;

for (i = nCount / 2; i < nCount; i++) {
Right->e_Keys[i - nCount / 2] = e_Keys[i];
Right->e_Vals[i - nCount / 2] = e_Vals[i];
Right->nCount = i - nCount / 2 + 1;
}

}
return;
}


////// Main.cpp ///////
////// Main.cpp ///////
////// Main.cpp ///////

#include <cstdio>

#include "LeafNode.h"
#include "TreeNode.h"

int main(int argc, char *argv[])
{
int a;
LeafNode<int, int, 7> TestNode;
TreeNode<int, int, 7> *e, *f;
TestNode.Insert(10, 10, a, e, f);
return 0;
}

I really appreciate your help. Thanx for everything.
Sincerely.
Tayfun Özdemir.
Oct 24 '05 #4
Tayfun Özdemir wrote:
Thank you so Jonathan. You were right. Some files were named "c" instead of
"cpp" :-).
Please quote the message you are answering to.
It compiles fine now. But I get linker error. I would be very glad if you
can explain what is wrong with my project. I have checked function
parameters and return value. They all match each other. I could not find the
error.


As I said before, most current compilers cannot handle templates if
they don't have access to their definitions:

// c.h
template <class T>
class C
{
public:
T foo();
};

// c.cpp
# include "c.h"

template <class T>
T C<T>::foo()
{
// ...
}
// main.cpp
# include "c.h"

int main()
{
C<int> c;
c.foo();
}

The compiler usually has no problem with that, but the linker will not
be able to find the corresponding function. To solve this problem, make
the member function inline:

// c.h
template <class T>
class C
{
public:
T foo()
{
// ...
}
};

// c.cpp

// empty
See http://www.parashift.com/c++-faq-lit...html#faq-35.13 for
more informations. Read the whole faq while you're there.
Jonathan

Oct 24 '05 #5
"Jonathan Mcdougall" <jo***************@gmail.com>, haber iletisinde sunlari
yazdi:11**********************@g49g2000cwa.googleg roups.com...
Tayfun Özdemir wrote:
Thank you so Jonathan. You were right. Some files were named "c" instead
of
"cpp" :-).
Please quote the message you are answering to.
It compiles fine now. But I get linker error. I would be very glad if you
can explain what is wrong with my project. I have checked function
parameters and return value. They all match each other. I could not find
the
error.


As I said before, most current compilers cannot handle templates if
they don't have access to their definitions:

// c.h
template <class T>
class C
{
public:
T foo();
};

// c.cpp
# include "c.h"

template <class T>
T C<T>::foo()
{
// ...
}
// main.cpp
# include "c.h"

int main()
{
C<int> c;
c.foo();
}

The compiler usually has no problem with that, but the linker will not
be able to find the corresponding function. To solve this problem, make
the member function inline:

// c.h
template <class T>
class C
{
public:
T foo()
{
// ...
}
};

// c.cpp

// empty
See http://www.parashift.com/c++-faq-lit...html#faq-35.13 for
more informations. Read the whole faq while you're there.
Jonathan

-

Thank you so much again Jonathan. I read all of the FAQ and I tried both of
the suggestions on the FAQ. Unfortunately I could not solve my problem. I
will try to figure it out by trying something different.
Thanx for your replies.
Tayfun Özdemir.
Oct 24 '05 #6
Tayfun Özdemir wrote:
"Jonathan Mcdougall" <jo***************@gmail.com>, haber iletisinde sunlari

Please quote the message you are answering to.

[snipped badly quoted message]

http://web.presby.edu/~nnqadmin/nnq/nquote.html

Please, read it.
Thank you so much again Jonathan. I read all of the FAQ and I tried both of
the suggestions on the FAQ. Unfortunately I could not solve my problem. I
will try to figure it out by trying something different.


Perhaps we could help you more if you provided the error messages
generated with the code you provided in your previous post.
Jonathan

Oct 24 '05 #7
"Jonathan Mcdougall" <jo***************@gmail.com>, haber iletisinde
sunlari yazdi:11**********************@g43g2000cwa.googleg roups.com...
Tayfun Özdemir wrote:
"Jonathan Mcdougall" <jo***************@gmail.com>, haber iletisinde
sunlari

Please quote the message you are answering to.
[snipped badly quoted message] http://web.presby.edu/~nnqadmin/nnq/nquote.html Please, read it. Thank you so much again Jonathan. I read all of the FAQ and I tried both
of
the suggestions on the FAQ. Unfortunately I could not solve my problem. I
will try to figure it out by trying something different. Perhaps we could help you more if you provided the error messages
generated with the code you provided in your previous post.
Jonathan


I will change my newsreader very soon. Thanx for your reply.

I have changed my cpp and h files to their original.
I get following errors with different compilers:
////////////// .NET errors ////////////////

BTree error LNK2001: unresolved external symbol "public: virtual void
__thiscall TreeNode
<int,int,7>::Insert(int,int,int &,class TreeNode<int,int,7> * &,class
TreeNode<int,int,7> * &)" (?
Insert@?$TreeNode@HH$06@@UAEXHHAAHAAPAV1@1@Z)

BTree error LNK2019: unresolved external symbol "public: virtual void
__thiscall LeafNode
<int,int,7>::Insert(int,int,int &,class TreeNode<int,int,7> * &,class
TreeNode<int,int,7> * &)" (?
Insert@?$LeafNode@HH$06@@UAEXHHAAHAAPAV?$TreeNode@ HH$06@@1@Z) referenced in
function _main
BTree fatal error LNK1120: 2 unresolved externals

////////////// gcc errors////////////////

[shootgun@plesk Tree]$ gcc LeafNode.cpp main.cpp TreeNode.cpp -o h
/tmp/ccnze0Bu.o(.text+0x3a): In function `main':
: undefined reference to `LeafNode<int, int, 7>::Insert(int, int, int&,
TreeNode<int, int, 7>*&,
TreeNode<int, int, 7>*&)'
/tmp/ccnze0Bu.o(.gnu.linkonce.d._ZTV8LeafNodeIiiLi7EE+0 x8): undefined
reference to `LeafNode
<int, int, 7>::Insert(int, int, int&, TreeNode<int, int, 7>*&, TreeNode<int,
int, 7>*&)'
/tmp/ccnze0Bu.o(.gnu.linkonce.d._ZTV8TreeNodeIiiLi7EE+0 x8): undefined
reference to `TreeNode
<int, int, 7>::Insert(int, int, int&, TreeNode<int, int, 7>*&, TreeNode<int,
int, 7>*&)'
/tmp/ccnze0Bu.o(.gnu.linkonce.d._ZTI8TreeNodeIiiLi7EE+0 x0): undefined
reference to `vtable for
__cxxabiv1::__class_type_info'
/tmp/ccnze0Bu.o(.gnu.linkonce.d._ZTI8LeafNodeIiiLi7EE+0 x0): undefined
reference to `vtable for
__cxxabiv1::__si_class_type_info'
/tmp/ccnze0Bu.o(.eh_frame+0x11): undefined reference to
`__gxx_personality_v0'
collect2: ld returned 1 exit status


I paste my files again. I am not sure if the last ones are correct.

////////////// TreeNode.h ////////////////
#ifndef __TREE_NODE__
#define __TREE_NODE__
template <class KeyType, class ValType, int SIZE>
class TreeNode
{
public:
TreeNode() : nCount(0)
{};

virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild);
protected:
int nCount;
KeyType e_Keys[SIZE];
TreeNode<KeyType, ValType, SIZE> *e_Childs[SIZE];
};

#endif


////////////// TreeNode.cpp ////////////////

#include "TreeNode.h"

template <class KeyType, class ValType, int SIZE>
void TreeNode<KeyType, ValType, SIZE>::Insert(KeyType Key, ValType Val,
KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild)
{
return;
}



////////////// LeafNode.h ////////////////

#include "TreeNode.h"

#ifndef __LEAF_NODE__
#define __LEAF_NODE__

template <class KeyType, class ValType, int SIZE>
class LeafNode : public TreeNode<KeyType, ValType, SIZE>
{
public:

LeafNode()
{
nCount = 0;
};
virtual void Insert(KeyType Key, ValType Val, KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild);

protected:
ValType e_Vals[SIZE];
};
#endif


////////////// LeafNode.cpp ////////////////

#include "LeafNode.h"

template <class KeyType, class ValType, int SIZE>
void LeafNode<KeyType, ValType, SIZE>::Insert(KeyType Key, ValType Val,
KeyType &ParentKey,
TreeNode<KeyType, ValType, SIZE> *&LeftChild,
TreeNode<KeyType, ValType, SIZE> *&RightChild)
{
int i = nCount;

// Shift values in the list by one until we find the spot
while (i != 0 && e_Keys[i - 1] > Key) {
e_Keys[i] = e_Keys[i - 1];
e_Vals[i] = e_Vals[i - 1];
i--;
}

// We are on the spot add new value to the list
e_Keys[i] = Key;
e_Vals[i] = Val;
nCount++;

// Check if we are full and are ready to split
if (nCount == SIZE) {
LeafNode<KeyType, ValType, SIZE> *Right = new LeafNode<KeyType,
ValType, SIZE>;

for (i = nCount / 2; i < nCount; i++) {
Right->e_Keys[i - nCount / 2] = e_Keys[i];
Right->e_Vals[i - nCount / 2] = e_Vals[i];
Right->nCount = i - nCount / 2 + 1;
}

}
return;
}


////////////// main.cpp ////////////////

#include <cstdio>

#include "LeafNode.h"
#include "TreeNode.h"
int main(int argc, char *argv[])
{
int a;
LeafNode<int, int, 7> TestNode;
TreeNode<int, int, 7> *e, *f;
TestNode.Insert(10, 10, a, e, f);
return 0;
}

Thank you so much for your answers and patience.
Sincerely,
Tayfun Ozdemir

Oct 24 '05 #8
Put your contents of .cpp files to corresponding .h files. They will
compile & link smoothly.

Oct 24 '05 #9
Ian
Tayfun Özdemir wrote:

I have changed my cpp and h files to their original.
I get following errors with different compilers:

I think it has already been pointed out to you that some compilers (gcc
included) require template function bodies to be visible in the
compilation unit that uses them. I suggest you try including
TreeNode.cpp at the end of TreeNode.h, or just make life easy an inline
the function in the .h file.

Ian
Oct 24 '05 #10

"Ian" <ia******@hotmail.com>, haber iletisinde sunlari
yazdi:11***************@drone2-svc-skyt.qsi.net.nz...
Tayfun Özdemir wrote:

I have changed my cpp and h files to their original.
I get following errors with different compilers:

I think it has already been pointed out to you that some compilers (gcc
included) require template function bodies to be visible in the
compilation unit that uses them. I suggest you try including TreeNode.cpp
at the end of TreeNode.h, or just make life easy an inline the function in
the .h file.

Ian


You are absolutely right. I was told that I have to put them in somefile
where compiler can see them at compile time each time.
I just forgot about it :-(. Last time I used C++ was 3 years ago.

I really appreciate your efforts Ian, Jonathan and Upashu2.
Thanx for your replies.

Oct 24 '05 #11

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Daan | last post by:
Hello all, I'm having a little problem with Smarty. Getting it to work in a simple case went fine, but now I have the following situation: / /smarty /templates template.tpl /templates_c
5
by: Buchleitner Martin | last post by:
Hi! I got another problem parsing my XML document: <document> <paragraph> <style val=listing/> <text>listing #1 text</text> </paragraph> <paragraph>
3
by: Alan Krueger | last post by:
Greetings, I've been able to cache Transformer objects in a Tomcat-based servlet application to avoid unnecessary Transformer rebuilding, except for certain ones on certain machines. I'm...
3
by: bjam | last post by:
Help! The apply-templates function is not currently allowing me to select a specific template... eventhough I tried putting a select statement, it does not seem to work??? Can someone help show...
9
by: Fred H | last post by:
I'm currently trying to write a function template that can fill a variable of arbitrary type with 'random' stuff, but I can't seem to get my function template working. In my .h file I've...
15
by: Rob Ratcliff | last post by:
I'm compiling the latest version of a CORBA ORB called MICO on a Cray X1. It makes heavy use of templates and namespaces. Up until the link step, the C++ source code compiled flawlessly. But, when...
5
by: Christian Christmann | last post by:
Hi, I want to implement an graph using templates. In my header file I define the templates node and edge: template <class NODE> class GNode { NODE *info; public: GraphNode();
3
by: Ali Sahin | last post by:
Hi there, I'd like to transform a XML-File to PDF. The XML-File ist build like followed: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet type="text/xsl"...
1
by: david | last post by:
Hello, I decided to play a bit with templates and classes, but discovered some problems. So, I have 3 files: LinkedList.h LinkedList.cpp and test.cpp (by the way it is not finished fully) ...
8
by: Tim Frink | last post by:
Hi, I want to use a callback function together with templates. Let's say I've this code: File a.h: class A { private:
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
by: marcoviolo | last post by:
Dear all, I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.