C ++假功能指针等价

时间:2015-08-20 18:53:24

标签: c++ pointers

所以我遇到的问题很复杂但很重要。我无法判断这是C ++的功能还是编译器功能。但是,正在发生的事情是来自不同类的两个不同的函数获得相同的地址:

//-- My Code --//
class A {
public:
    int myFunc() {
        return 3;
    }
};


//-- Other Code --//
namespace glm{
namespace detail
{
    template <typename T>
    GLM_FUNC_QUALIFIER typename tvec3<T>::size_type tvec3<T>::length() const
    {
        return 3;
    }

    //... Omitted
}
}

//-- Test --//
TypelessMember::Func<int> funcOverridenA = TypelessMember::func(&A::myFunc); // The original function pointer (pretending to be a member function of a "typeless" class)
auto equivalenceFunc = &glm::detail::tvec3<unsigned char>::length; // Get the false equivalence member function pointer
auto equivalence = *(TypelessMember::Func<int>*)&equivalenceFunc; // Pretend that this is a different type of function
if (equivalence == funcOverridenA) {
    puts("False function equivalence"); // This block of code is hit
    return false;
}


//-- Other test --//
A valueA = {};
TypelessMember* typelessA = typeless(&valueA);
int v = (typelessA->*funcOverridenA)(); // This calls the glm function (I guess because it was produced in the PCH first)

显然,我不希望A :: myFunc的函数指针等效于指向glm长度函数的函数指针。那我该怎么办?这可以以某种方式避免吗?我主要担心的是因为我希望能够有两个独特的函数指针。

1 个答案:

答案 0 :(得分:3)

这是MS编译器的已知问题。当他们删除&#34;不用的&#34;函数的副本,比如实例化的模板,它们会查看函数包含的内容,而不是它们的名称。

你有两个函数不带参数并返回值3.它们当然会产生完全相同的代码。链接器只保留一个副本,相信没有人想要一些代码的相同副本。

相关问题