Функция-член шаблона не может правильно видеть не шаблонный член класса

0

Задний план

У меня есть шаблон без шаблонов, в котором объявлена функция шаблонов-членов.

Он выглядит примерно так:

.hpp

class Foo
{
private:
    std::string libFilename;
    bool libLoaded;
    bool libFunctionsLoaded;
    HINSTANCE libHandle;
    std::map<std::string, long long int> libFunctions;
public:
    Foo(std::string libFilename);
    ~Foo(void);

    template<typename FunctionPointerType>
    FunctionPointerType getFunctionPtr(std::string functionName);

    void addUnitTestBlock(UnitTestBlock& newGroup);
};

template<typename FunctionPointerType>
FunctionPointerType Foo::getFunctionPtr(std::string functionName)
{
    return reinterpret_cast<FunctionPointerType>(this->libFunctions[functionName];);
}

В cpp реализованы другие функции. Ради того, чтобы сделать это читаемым, я не включаю его. В основном, эта реализация будет загружать кучу DLL-функций из библиотеки и помещать имена и адреса (полученные из GetProcAddress()) в карту, которую вы видите в классе Foo.

Этот код был проверен, и я могу вытащить адрес и направить его на указатель функции и использовать функцию просто отлично...

проблема

Однако внутри функции шаблона карта имеет размер = 0. По какой-то причине функция шаблона не может видеть правильный член класса, когда дело доходит до карты <>. Он видит правильные значения для libLoaded и libFunctionsLoaded. Кроме того, функция шаблона не вызывается до тех пор, пока не будет заполнена карта libFunctions.

Вот как структурирована основная структура, чтобы дать вам представление о шаблоне вызова:

//DLL Function pointer prototypes
typedef int (*TestFunction)(int,char);

//Loads the whole DLL and populates the member variables including the map...
Foo libraryLoader= Foo("library.dll");


    TestFunction function = libraryLoader.getFunctionPtr<TestFunction>("testFunc");

    if(function(2, 'a') == 99)
    {
        std::cout << "Pass" << std::endl;
    }
    else
    {
        std::cout << "Fail" << std::endl;
    }

Это пройдет, если я избавлюсь от шаблона и просто сделаю бросок.

Моя цель состояла в том, чтобы удалить необходимость кастинга в части пользователей, и просто попросите их передать тип указателя функций и бросить его для них. Любые идеи о том, почему функция шаблона не может видеть std :: map, но он может видеть bool?

  • 0
    Где функция шаблона получает доступ к карте?
  • 0
    Возможная копия Почему шаблоны могут быть реализованы только в заголовочном файле? ?
Показать ещё 10 комментариев
Теги:
templates
visual-studio-2012

1 ответ

0
Лучший ответ

Проверьте свой конструктор по умолчанию, конструктор копирования и любые другие пользовательские конструкторы/функции перемещения/оператора, которые вы пишете/перегрузите. Убедитесь, что они делают то, что, по вашему мнению, они делают.

Шаблонные функции отлично работают в не-шаблонных классах. Данные, являющиеся неточными или отсутствующими, скорее всего являются копией.

Изменение: Как упоминается ниже, пожалуйста... Соблюдайте правило пяти. Это определенно главный момент.

  • 1
    Короче говоря: соблюдайте правило пяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню