template: no matching function call. Converting const value to constreference.

C

cablepuff

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);

const BigInteger e(boost::lexical_cast<BigInteger>(rsa_encrypts[2]));
const BigInteger
n(boost::lexical_cast<BigInteger>(rsa_encrypts[1]));
std::string infile(rsa_encrypts[0]);
boost::scoped_ptr<boost::filesystem::ifstream> encrypt_input(new
boost::filesystem::ifstream(infile));
const std::string
plaintext(std::istreambuf_iterator<char>(encrypt_input->rdbuf()),
std::istreambuf_iterator<char>());
std::list said:
(plaintext, e, n)); // this is line 64.

std::vector<BigInteger>(ciphertext).swap(ciphertext);
// ... some code in between.
const std::string answer(encryptcpw::rsa_decrypt_list(ciphertext, d,
n)); // this is line 102.


error on gcc:
../cs512/c++/RsaEncrypt.cpp:64: error: no matching function for call to
'rsa_encr
ypt_list(const std::string&, const BigInteger&, const BigInteger&)'
../cs512/c++/RsaEncrypt.cpp:102: error: no matching function for call
to 'rsa_dec
rypt_list(std::vector<BigInteger, std::allocator<BigInteger> >&, const
BigIntege
r&, const BigInteger&)'


error on msvc:
../cs512/c++/RsaEncrypt.cpp(64) : error C2664:
'encryptcpw::rsa_encrypt_list' : cannot convert parameter 2 from
'const BigInteger' to 'BigInteger &'
Conversion loses qualifiers

Anybody know how to fix this.
 
T

tragomaskhalos

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);

const BigInteger e(boost::lexical_cast<BigInteger>(rsa_encrypts[2]));
const BigInteger
n(boost::lexical_cast<BigInteger>(rsa_encrypts[1]));
std::string infile(rsa_encrypts[0]);
boost::scoped_ptr<boost::filesystem::ifstream> encrypt_input(new
boost::filesystem::ifstream(infile));
const std::string
plaintext(std::istreambuf_iterator<char>(encrypt_input->rdbuf()),
std::istreambuf_iterator<char>());
std::list<BigInteger>
decrypted_list(encryptcpw::rsa_encrypt_list said:
(plaintext, e, n)); // this is line 64.

std::vector<BigInteger>(ciphertext).swap(ciphertext);
// ... some code in between.
const std::string answer(encryptcpw::rsa_decrypt_list(ciphertext, d,
n)); // this is line 102.

error on gcc:
./cs512/c++/RsaEncrypt.cpp:64: error: no matching function for call to
'rsa_encr
ypt_list(const std::string&, const BigInteger&, const BigInteger&)'
./cs512/c++/RsaEncrypt.cpp:102: error: no matching function for call
to 'rsa_dec
rypt_list(std::vector<BigInteger, std::allocator<BigInteger> >&, const
BigIntege
r&, const BigInteger&)'

error on msvc:
./cs512/c++/RsaEncrypt.cpp(64) : error C2664:
'encryptcpw::rsa_encrypt_list' : cannot convert parameter 2 from
'const BigInteger' to 'BigInteger &'
Conversion loses qualifiers

Anybody know how to fix this.

I believe the problem is here:

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);

... you can't const-qualify ContainerType::reference; Comeau online
gives warning "warning: type qualifiers are meaningless in this
declaration"

you need instead:
template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, typename
ContainerType::const_reference, typename
ContainerType::const_reference);

and define const_reference in your ContainerType(s) accordingly.
 
C

cablepuff

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);
const BigInteger e(boost::lexical_cast<BigInteger>(rsa_encrypts[2]));
const BigInteger
n(boost::lexical_cast<BigInteger>(rsa_encrypts[1]));
std::string infile(rsa_encrypts[0]);
boost::scoped_ptr<boost::filesystem::ifstream> encrypt_input(new
boost::filesystem::ifstream(infile));
const std::string
plaintext(std::istreambuf_iterator<char>(encrypt_input->rdbuf()),
std::istreambuf_iterator<char>());
std::list<BigInteger>
decrypted_list(encryptcpw::rsa_encrypt_list<std::list<BigInteger>
(plaintext, e, n)); // this is line 64.
std::vector<BigInteger>(ciphertext).swap(ciphertext);
// ... some code in between.
const std::string answer(encryptcpw::rsa_decrypt_list(ciphertext, d,
n)); // this is line 102.
error on gcc:
./cs512/c++/RsaEncrypt.cpp:64: error: no matching function for call to
'rsa_encr
ypt_list(const std::string&, const BigInteger&, const BigInteger&)'
./cs512/c++/RsaEncrypt.cpp:102: error: no matching function for call
to 'rsa_dec
rypt_list(std::vector<BigInteger, std::allocator<BigInteger> >&, const
BigIntege
r&, const BigInteger&)'
error on msvc:
./cs512/c++/RsaEncrypt.cpp(64) : error C2664:
'encryptcpw::rsa_encrypt_list' : cannot convert parameter 2 from
'const BigInteger' to 'BigInteger &'
Conversion loses qualifiers
Anybody know how to fix this.

I believe the problem is here:

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);

.. you can't const-qualify ContainerType::reference; Comeau online
gives warning "warning: type qualifiers are meaningless in this
declaration"

you need instead:
template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, typename
ContainerType::const_reference, typename
ContainerType::const_reference);

and define const_reference in your ContainerType(s) accordingly.

thanks that fixes everything.
 
C

cablepuff

template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);
const BigInteger e(boost::lexical_cast<BigInteger>(rsa_encrypts[2]));
const BigInteger
n(boost::lexical_cast<BigInteger>(rsa_encrypts[1]));
std::string infile(rsa_encrypts[0]);
boost::scoped_ptr<boost::filesystem::ifstream> encrypt_input(new
boost::filesystem::ifstream(infile));
const std::string
plaintext(std::istreambuf_iterator<char>(encrypt_input->rdbuf()),
std::istreambuf_iterator<char>());
std::list<BigInteger>
decrypted_list(encryptcpw::rsa_encrypt_list<std::list<BigInteger>
(plaintext, e, n)); // this is line 64.
std::vector<BigInteger>(ciphertext).swap(ciphertext);
// ... some code in between.
const std::string answer(encryptcpw::rsa_decrypt_list(ciphertext, d,
n)); // this is line 102.
error on gcc:
./cs512/c++/RsaEncrypt.cpp:64: error: no matching function for call to
'rsa_encr
ypt_list(const std::string&, const BigInteger&, const BigInteger&)'
./cs512/c++/RsaEncrypt.cpp:102: error: no matching function for call
to 'rsa_dec
rypt_list(std::vector<BigInteger, std::allocator<BigInteger> >&, const
BigIntege
r&, const BigInteger&)'
error on msvc:
./cs512/c++/RsaEncrypt.cpp(64) : error C2664:
'encryptcpw::rsa_encrypt_list' : cannot convert parameter 2 from
'const BigInteger' to 'BigInteger &'
Conversion loses qualifiers
Anybody know how to fix this.
I believe the problem is here:
template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, const typename
ContainerType::reference, const typename ContainerType::reference);
.. you can't const-qualify ContainerType::reference; Comeau online
gives warning "warning: type qualifiers are meaningless in this
declaration"
you need instead:
template <typename ContainerType>
ContainerType rsa_encrypt_list(const std::string&, typename
ContainerType::const_reference, typename
ContainerType::const_reference);
and define const_reference in your ContainerType(s) accordingly.

thanks that fixes everything.

now i got a new problem.
template <typename OutputIterator>
OutputIterator str_to_numlist(OutputIterator OutIt, const std::string&
s, typename OutputIterator::const_reference bound)
{
// some code.
}

template <typename ContainerType>
ContainerType encryptcpw::rsa_encrypt_list(const std::string& text,
typename ContainerType::const_reference e, typename
ContainerType::const_reference n)
{
typedef typename ContainerType::value_type T;
BOOST_STATIC_ASSERT(((std::numeric_limits<T>::is_integer) ||
(std::numeric_limits<T>::is_float)));
ContainerType encrypted_list;
encryptcpw::str_to_numlist(std::back_inserter(encrypted_list),
text, n);
BOOST_FOREACH(T& val, encrypted_list)
{
val = encryptcpw::rsa_encrypt(val, e, n);
}
return encrypted_list;
}

my error is this
: error :
../cs512/c++/RsaEncrypt.cpp:64: instantiated from here
../cs512/c++/cppdef/rsa.cpp:205: error: no matching function for call
to 'str_to_
numlist(std::back_insert_iterator<std::list<BigInteger,
std::allocator<BigIntege
r> > >, const std::basic_string<char, std::char_traits<char>,
std::allocator<cha
r> >&, const BigInteger&)'

Is it because the template parameter are different type that it gets
confuse? isn't const T& of std::back_inserter(std::list) same as const
T& of std::list
 

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,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top