ошибка: нет соответствующей функции для вызова функции namel - PullRequest
0 голосов
/ 26 июня 2018

Моя конечная цель - вычислить мощность квадратичного идеала, который реализован как структурные переменные в C, с использованием библиотеки GMP.

Мне дали библиотеку (ANTL), которая содержит обобщенные оптимизированные возведения в степень с использованием C ++шаблоны, пространства имен и NTL.Эта библиотека возводит в степень для типов NTL ZZ_p и т. Д., А также базовых типов, таких как long, float и т. Д.

Мне нужно использовать библиотеку ANTL для достижения моей конечной цели - вычисления силы идеала, C struct переменная .Поскольку раньше я никогда не работал с шаблонами и пространствами имен, прежде чем я хотел реализовать всю мощь базовой переменной mpz_t, чтобы посмотреть, как все работает.

Теперь у меня есть четыре заголовочных файла exp.hpp, expbin.hpp, impl.hpp, com.hpp и основной файл exp.cpp следующим образом -

COM.HPP

#ifndef GMPL_COM_H
#define GMPL_COM_H

#include <gmp.h>

namespace GMPL {
    template < class T >
    inline void assign(T C, const T A)
    {
        mpz_set(C, A);
    }

    template<class T>
    void mul (T C, const T A, const T B)
    {
        mpz_mul(C, A, B);
    }

    template<class T>
    void sqr (T C, const T A)
    {
        mpz_mul(C, A, A);
    }

}
#endif // guard

EXP.HPP

#ifndef EXP_H
#define EXP_H

#include "com.hpp"

namespace GMPL
{
    template < class T >
    class exp
    {
        public:
        exp() {};
        virtual ~exp() {};

        virtual void power (T C, const T A, const NTL::ZZ & n) = 0;
    };

} // GMPL

#endif // EXP_H

EXPBIN.HPP

#ifndef EXPBIN_H
#define EXPBIN_H

#include "exp.hpp"

namespace GMPL
{
    template < class T >
    class expbin : public exp<T>
    {
        public:
        expbin() {};
        ~expbin() {};

        void power (T C, const T A, const NTL::ZZ & n);
    };

} // GMPL

// Unspecialized template definitions.
#include "impl.hpp"

#endif // EXPBIN_H

IMPL.HPP

using namespace GMPL;

//
// compute A^n using standard left-to-right binary method
//
template < class T > 
void expbin<T>::power (T C, const T A, const NTL::ZZ & n)
{
    assign(C,A);
    for (register long i = NumBits(n)-2 ; i >= 0 ; i--)
    {
        sqr(C, C);
        if (bit(n, i) == 1)
            mul(C, C, A);
    }
}

EXP.CPP

#include <NTL/lzz_p.h>
#include <gmp.h>

namespace GMPL {}
using namespace GMPL;


#include "expbin.hpp"

NTL_CLIENT

int main ()
{
    // NTL variables
    ZZ n;

    // GMP variables
    mpz_t aa;
    mpz_t bb;
    mpz_init(aa);
    mpz_init(bb);

    // generate random exponent of size 512 bits
    RandomLen (n, 512); // NTL function

    // initialize exponentiation classes
    expbin<mpz_t> obj;

    // compute a^n with available methods
    obj.power (bb,aa,n);

    // check and output results
    gmp_printf("%Zd", bb);
}

, когда я пытаюсь скомпилировать EXP.CPP , используя (как упомянуто в документации NTL Виктора Шоупа онлайн)

g++ -g -O2 -std=c++11 -pthread -march=native exp.cpp -o t -lntl -lgmp -lm

Я получаю следующеесообщения об ошибках -

$ g++ -g -O2 -std=c++11 -pthread -march=native exp.cpp -o t -lntl -lgmp -lm
In file included from exp.cpp:8:
In file included from ./expbin.hpp:46:
./impl.hpp:16:10: warning: 'register' storage class specifier is deprecated and
      incompatible with C++1z [-Wdeprecated-register]
    for (register long i = NumBits(n)-2 ; i >= 0 ; i--)
         ^~~~~~~~~
./impl.hpp:15:5: error: no matching function for call to 'assign'
    assign(C,A);
    ^~~~~~
exp.cpp:28:9: note: in instantiation of member function
      'GMPL::expbin<__mpz_struct [1]>::power' requested here
    obj.power (bb,aa,n);
        ^
./com.hpp:16:17: note: candidate template ignored: deduced conflicting types for
      parameter 'T' ('__mpz_struct *' vs. 'const __mpz_struct *')
    inline void assign(T C, const T A)
                ^
In file included from exp.cpp:8:
In file included from ./expbin.hpp:46:
./impl.hpp:20:13: error: no matching function for call to 'mul'
            mul(C, C, A);
            ^~~
./com.hpp:22:10: note: candidate template ignored: deduced conflicting types for
      parameter 'T' ('__mpz_struct *' vs. 'const __mpz_struct *')
    void mul (T C, const T A, const T B)

Тщательное гугление этих ошибок показывает, что в родительском классе должен быть пустой конструктор, но он у меня уже есть.

Я знаю, что оператор компиляции правильный, потому что кроме этого ничего не работает при использовании NTL.На данный момент у меня закончились идеи, чтобы это исправить.Заранее спасибо.

РЕДАКТИРОВАТЬ Этот вопрос был решен.Я хочу, чтобы этот вопрос был закрыт или удален.

1 Ответ

0 голосов
/ 26 июня 2018

Одним из решений было бы не использовать шаблоны для ваших функций-оболочек.Похоже, что будет только один параметр шаблона, который когда-либо имеет смысл (например, T заменяется на mpz_t), учитывая, что параметр шаблона должен быть совместим с mpz_set.Шаблоны кажутся неподходящим инструментом для работы.Просто определите ваши обертки, принимая параметры типа mpz_t и const mpz_t:

inline void assign(mpz_t C, const mpz_t A)
{
    mpz_set(C, A);
}

Вы сказали, что хотите изучать шаблоны, но использование их в неподходящем контексте не будет таким полезным.И у вас все еще есть шаблоны для ваших классов.

При этом я могу интерпретировать сообщения компилятора для вас.


предупреждение: хранилище 'register'спецификатор класса устарел и несовместим с C ++ 1z [-Wdeprecated-register]
for (register long i = NumBits(n)-2 ; i >= 0 ; i--)

Это легко исправить.Избавьтесь от «регистрации» в этой строке.Это больше не оптимизация производительности.

ошибка: нет функции соответствия для вызова 'assign'
assign(C,A);
[...]
примечание: шаблон кандидата игнорируется: выведены конфликтующие типы для параметра 'T'

Компилятору не удается понять, что использовать в качестве параметра шаблона в этом вызове функции.Есть два аргумента функции, каждый из которых подразумевает, каким должен быть параметр шаблона для assign.(Это отличается от параметра шаблона для expbin, хотя оба они названы T.) Это проблема, когда последствия конфликтуют.Один из способов сделать эту работу должен состоять в том, чтобы указать, каким должен быть параметр, как в

assign<T>(C, A);

. Это делает явным, что параметр шаблона для assign (задается между < и * 1038).*) предполагается, что это параметр шаблона для expbin (значение T в данном контексте).

Примечание: Определенные вами шаблоны выглядят так, как будто они обычно работают безнеобходимо указать T, как это.Однако технически mpz_t является массивом одной структуры (а не просто структуры), и массивы, используемые в качестве аргументов, могут разрушаться, что может привести к путанице типов.

Ошибка: нет соответствующей функции для вызовав 'mul'
mul(C, C, A);
примечание: шаблон кандидата игнорируется: обнаружены конфликтующие типы для параметра 'T'

То же самое (хотя в этом случае имеется три аргумента функции, поэтому тривыводил кандидатов на T).

mul<T>(C, C, A);
...