template function within template class

I

Itchy

Hi!

I just don't understand why my compiler complains about this line in
my program (see below). Maybe you can help me?

You can skip all the overloaded operators. I've marked the problem
areas. I get error in function generate_subkeys()

/Itchy

/*****************************************/
#include <bitset>

using namespace std;

template <size_t bits>
class Block : public bitset<bits>
{
public:
bool operator[](size_t pos) const
{
return bitset<bits>::eek:perator[]((bits - pos) % bits);
}

reference operator[](size_t pos)
{
return bitset<bits>::eek:perator[]((bits - pos) % bits);
}

Block& operator<<=(size_t pos)
{
Block b(*this);
for (int i = 1; i <= bits; i++) b[i - pos] = (*this);
return (*this = b);
}

Block& operator>>=(size_t pos)
{
Block b(*this);
for (int i = 1; i <= bits; i++) b[i + pos] = (*this);
return (*this = b);
}

Block operator<<(size_t pos) { return (Block(*this) <<= pos); }
Block operator>>(size_t pos) { return (Block(*this) <<= pos); }

/********* LOOK HERE!! PROBLEM
**********************************/
template <size_t subbits>
Block<subbits> subset(size_t left, size_t right)
{
Block<subbits> b;
for (int i = left; i <= right; i++) b[i - left + 1] = (*this);
return b;
}
};

class DES
{
public:

//protected:
void apply_pc1()
{
for (int i = 1; i <= 56; i++) newkey = key[PC1[i - 1]];
}

void generate_subkeys()
{
Block<28> left;
bool b;
//, right;
for (int r = 1; r <= 16; r++)
{
/********* LOOK HERE!! PROBLEM
**********************************/
// IT CANT FIND MY TEMPLATE FUNCTION. COMPILER SAYS IT RETURNS
BOOL?!?!
left = newkey.subset<28>(1, 28); // <----- ERROR

}
}

private:
Block<64> key;
Block<56> newkey;
Block<28> subkeys[16];

};
 
V

Victor Bazarov

Itchy said:
I just don't understand why my compiler complains about this line in
my program (see below). Maybe you can help me?

You can skip all the overloaded operators. I've marked the problem
areas. I get error in function generate_subkeys()

As soon as I removed the second operator[] ('reference' was undefined)
and changed all other places were it was used, the code compiles. It
is possible that your compiler is not good enough. Visual C++ v6 is
like that. You should consider getting a better compiler if yours is
VC++ v6 and you want to be able to handle member templates.

/*****************************************/
#include <bitset>

using namespace std;

template <size_t bits>
class Block : public bitset<bits>
{
public:
bool operator[](size_t pos) const
{
return bitset<bits>::eek:perator[]((bits - pos) % bits);
}

Block& operator<<=(size_t pos)
{
Block b(*this);
for (int i = 1; i <= bits; i++) (*this);
return (*this = b);
}

Block& operator>>=(size_t pos)
{
Block b(*this);
for (int i = 1; i <= bits; i++) (*this);
return (*this = b);
}

Block operator<<(size_t pos) { return (Block(*this) <<= pos); }
Block operator>>(size_t pos) { return (Block(*this) <<= pos); }

/********* LOOK HERE!! PROBLEM **********************************/
template <size_t subbits>
Block<subbits> subset(size_t left, size_t right)
{
Block<subbits> b;
for (int i = left; i <= right; i++) (*this);
return b;
}
};

int PC1[10];

class DES
{
public:

//protected:
void apply_pc1()
{
for (int i = 1; i <= 56; i++) key[PC1[i - 1]];
}

void generate_subkeys()
{
Block<28> left;
bool b;
//, right;
for (int r = 1; r <= 16; r++)
{
/********* LOOK HERE!! PROBLEM
**********************************/
// IT CANT FIND MY TEMPLATE FUNCTION. COMPILER SAYS IT RETURNS
BOOL?!?!
left = newkey.subset<28>(1, 28); // <----- ERROR

}
}

private:
Block<64> key;
Block<56> newkey;
Block<28> subkeys[16];

};

int main()
{
DES des;
des.generate_subkeys();

return 0;
}

Victor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top