模板成员函数无法正确查看非模板化的类成员

时间:2014-11-18 21:33:04

标签: c++ windows templates visual-studio-2012

背景

我有一个非模板化的类,其中声明了模板化成员函数

看起来类似于以下内容:

.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.由于某种原因,当涉及到地图&lt;&gt;时,模板函数无法看到正确的类成员。它确实看到了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的任何想法?

1 个答案:

答案 0 :(得分:0)

检查您的默认构造函数,复制构造函数以及您编写/重载的任何其他自定义构造函数/ move / operator函数。确保这些正在做你认为他们正在做的事情。

模板化函数在非模板化类中工作得很好。数据不准确或丢失很可能是复制问题。

编辑:正如pmr在下面提到的那样......遵守五条规则。这绝对是重点。