首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有重载的模板中的c++静态方法和继承

带有重载的模板中的c++静态方法和继承
EN

Stack Overflow用户
提问于 2016-01-16 08:26:34
回答 2查看 923关注 0票数 2

这是我在这里的第一篇帖子,我找了好几天的答案,所以我问了。这是一个复杂的结构。我将SpiderMonkey javascript引擎嵌入到Illustrator插件中。插画有一个复杂的,有时不一致的API。在这种情况下,我必须调用一个以短类型作为参数的方法:

代码语言:javascript
复制
namespace ai
{
...
typedef signed short    int16;
...
};

该方法被称为结构中的指针:

代码语言:javascript
复制
struct AIDocumentSuite {
...
    AIAPI AIErr (*GetDocumentRulerUnits) ( ai::int16 *units );
...
};

但是,枚举是参数的来源:

代码语言:javascript
复制
enum AIDocumentRulerUnitValue {
    kUnknownUnits = 0,
    /** inches */
    kInchesUnits,
    /** centimeters */
    kCentimetersUnits,
    /** points */
    kPointsUnits,
    /** picas */
    kPicasUnits,
    /** millimeters */
    kMillimetersUnits,
    /** pixels */
    kPixelsUnits,
    /** Q units */
    kQUnits
};

为了让SpiderMonkey管理javascript对象,我将所有这些都封装在类中。我在代码中的某个地方有以下工作调用(稍微简化了一些,清理了测试和验证):

代码语言:javascript
复制
ai::int16 aiDocumentRulerUnitValue;
AIErr aiErr = sAIDocument->GetDocumentRulerUnits(&aiDocumentRulerUnitValue);

...

            if (!jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, value))
                return false;

...
            jsProperty::SetProperty(cx, &obj, "value", value, true);

...

我的问题是FromAIObject。

我有一个模板基类:

代码语言:javascript
复制
template<typename T> class jsBaseDataClass : public jsBaseClass
{
public:
...

    template <typename jsT> static bool FromAIObject(JSContext *cx, T* aiObj, JSObject*& obj)
    {
...
return true;
    }
}

和派生类:

代码语言:javascript
复制
class jsAIDocumentRulerUnitValue : public jsBaseDataClass<AIDocumentRulerUnitValue>
{
public:
...
    template <typename jsT> static bool FromAIObject(JSContext *cx, ai::int16* aiint16, JSObject*& obj)
    {
        AIDocumentRulerUnitValue aiDocumentRulerUnitValue = static_cast<AIDocumentRulerUnitValue>(*aiint16);

        return jsEnumDataClass<jsBaseClass>::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
    }

...
}

现在,问题是:如果我在后一篇文章中写道:

代码语言:javascript
复制
jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);

它将尝试调用派生类中的方法(参数为ai::it 16= signed )。

如果派生类中的方法不存在,则不管第二个参数的类型如何,它都将从父类调用该方法。

我希望能够根据其参数寻找合适的方法。这将使我在两个方法的每个派生类中都有一个副本(如果必要的话,或者至少有一个默认方法的副本)。

我做错了什么,或者如何使它们表现为在非静态方法中重载继承?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-16 09:28:47

做点这样的事。

代码语言:javascript
复制
class Base {
public:
    static void method(std::string someParam);
}

class Derived : public Base {
public:
    using Base::method;
    static void method(int param);
}

重点是使用using关键字使基类的函数可见。

票数 1
EN

Stack Overflow用户

发布于 2016-01-16 08:54:08

你没做错什么。你的问题看上去像是stack overflow: inheritance and method overloading的复制品

除非using XXXX,否则重载的方法会丢失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34824999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档