Pages: [1]   Go Down
Author Topic: Help using templates.  (Read 542 times)
0 Members and 1 Guest are viewing this topic.
San Pedro, CA.
Offline Offline
Full Member
***
Karma: 3
Posts: 149
My head HURTS!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm trying to learn templates. smiley-confuse I've been reading a tutorial (Web page: http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1 ). I copied an example from the tutorial but when I compile I get an error: 'TYPE' does not name a type, it highlights the error line as the first line, the line declaring the template.

Here's my sketch:
Code:
template<class TYPE>
TYPE Add(TYPE n1, TYPE n2)
{
    TYPE result;
    result = n1 + n2;
    return result;
}

void setup()
{
    float x = 2.1;
    float y = 5.6;
    Serial.begin(115200);
    Serial.println(Add(x, y));
}

void loop()
{
}

I thought the purpose of using a template (in this case) was so you didn't have to (explicitly) name a type. Can someone help me understand why I'm getting an error and the author of the tutorial (obviously) is not.

Thanks for your time,
DJ
« Last Edit: November 26, 2012, 08:21:18 am by DigitalJohnson » Logged

DigitalJohnson

North Queensland, Australia
Online Online
Edison Member
*
Karma: 55
Posts: 1810
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This is the IDE's fault, add the function prototype above the definition:

Code:
template<class TYPE> TYPE Add(TYPE n1, TYPE n2);

The IDE otherwise generates a prototype as:

Code:
TYPE Add(TYPE n1, TYPE n2);

leaving TYPE as undefined.
Logged


San Pedro, CA.
Offline Offline
Full Member
***
Karma: 3
Posts: 149
My head HURTS!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@pYro_65

I did figure out it was the IDE when it compiled using atmel studio. I had no idea how to get it to compile in the arduino IDE. I'll give this a try and let you know if it works for me. smiley-wink

Thanks,
DJ
Logged

DigitalJohnson

San Pedro, CA.
Offline Offline
Full Member
***
Karma: 3
Posts: 149
My head HURTS!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nope. Same error: 'TYPE' does not name a type.

My sketch:
Code:
template<class TYPE> TYPE Add(TYPE n1, TYPE n2);

TYPE Add(TYPE n1, TYPE n2)
{
    TYPE result;
    result = n1 + n2;
    return result;
}

void setup()
{
    float x = 2.1;
    float y = 5.6;
    Serial.begin(115200);
    Serial.println(Add(x, y));
}

void loop()
{
}

The error is at line 3. I was mistaken in my first post. The error was in the same place as indicated this time. I'm using a Mega1280 & IDE1.0.2. Any further thoughts/ideas. As I stated above I can get this to compile using atmel studio. It's just easier to do short code tests using the arduino IDE.

Thanks again for any help,
DJ
Logged

DigitalJohnson

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 553
Posts: 46299
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You may need to put your template function declaration in a separate header file, and include it in the sketch.

By the time you get to templates, this should be second nature.
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
template<class TYPE> TYPE Add(TYPE n1, TYPE n2);

TYPE Add(TYPE n1, TYPE n2)
{
    TYPE result;
    result = n1 + n2;
    return result;
}

Yes, but the function above does not match the prototype.

This compiles under IDE 1.0.2:

Code:
template<typename TYPE> TYPE Add(TYPE n1, TYPE n2);

template<typename TYPE> TYPE Add(TYPE n1, TYPE n2)
{
    TYPE result;
    result = n1 + n2;
    return result;
}

It won't compile under 1.0.1 because that doesn't honour function prototypes when the IDE tries to generate its own.
Logged

San Pedro, CA.
Offline Offline
Full Member
***
Karma: 3
Posts: 149
My head HURTS!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks Nick, that worked. I didn't know the template was part of the function declaration.

Quote
By the time you get to templates, this should be second nature.

Does this mean I'm in over my head?... You're probably right. smiley-razz

Thanks for the replies,
DJ
Logged

DigitalJohnson

Offline Offline
Edison Member
*
Karma: 17
Posts: 1041
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Templates are fun, especially when you start programming with them:
Code:
template <unsigned long n> struct Factorial {
    static const unsigned long val = Factorial<n-1>::val * n;
};
template <> struct Factorial <0> {
    static const unsigned long val = 1;
};

void setup() {
    Serial.print(" 3! = "); Serial.print(Factorial<3>::val);
    Serial.print(" 4! = "); Serial.print(Factorial<4>::val);
    Serial.print(" 6! = "); Serial.print(Factorial<6>::val);
    Serial.print("20! = "); Serial.print(Factorial<20>::val);
    Serial.print("30! = "); Serial.print(Factorial<30>::val);
}
void loop(){}
Logged

San Pedro, CA.
Offline Offline
Full Member
***
Karma: 3
Posts: 149
My head HURTS!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@WizenedEE
You forgot Serial.begin();
To be honest I have no idea how your example works. smiley-confuse I'm not that good at coding yet. But thanks for it anyway. I'll study it some more and see if I can figure it out.

DJ
Logged

DigitalJohnson

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

He's trying to send the compiler into a loop. smiley-razz
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 553
Posts: 46299
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Templates are fun, especially when you start programming with them
I think that that example is a bit contrived, since factoral doesn't make sense for anything other than ints.

What would the function body look like for:
Code:
template <String> struct Factorial
{
};
template <> struct Factorial <0>
{
};

void setup()
{
    Serial.print(" Joe! = "); Serial.print(Factorial<"Joe">::val);
}
void loop(){}
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1041
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Templates are fun, especially when you start programming with them
I think that that example is a bit contrived, since factoral doesn't make sense for anything other than ints.

The template's parameter type is unsigned long, not class or typename. It's just a way to shift the processing from the arduino to the compiler.
Logged

Pages: [1]   Go Up
Jump to: