【问题标题】:Curiously Recurring Template Pattern and statics in the base class基类中奇怪的重复模板模式和静态
【发布时间】:2013-08-09 19:49:50
【问题描述】:

感谢this answer,我正在考虑用 CRTP 实现我的问题。但是我有一个问题。在我的静态基类中,我有 2 组函数。一个采用 std::vectors,一个采用标准 C 风格的数组。因此,在基类中,我定义了一个调用非 std::vector 函数的静态函数。

但是,当我从该基类派生时,我似乎不再能够访问基类中的公共静态函数(我认为我可以)。

template< class Derived > class Base
{
public:
    static void Func( std::vector< float >& buffer )
    {
       Func( &buffer.front(), buffer.size() );
    }

    static void Func( float* pBuffer, int size )
    {
        Derived::Func( pBuffer, size );
    }
};

然后我定义派生类如下:

class Derived : public Base< Derived >
{
public:
    static void Func( float* pBuffer, int size )
    {
        // Do stuff
    }
};

但是,当我尝试在基类中调用静态函数时:

Derived::Func( stlVec );

Derived 类会引发编译错误:

error C2665: 'main' : none of the 2 overloads could convert all the argument types
1>          c:\development\Base.h(706): could be 'void Func( float*, int )

我假设我能够从派生类调用基类中定义的公共静态。但是,情况似乎并非如此……任何人都可以提出一种解决方法,这并不意味着必须在我的每个派生类中实现 std::vector 函数吗?

【问题讨论】:

    标签: c++ static crtp static-polymorphism


    【解决方案1】:

    Func 在派生类中隐藏所有具有相同名称的基成员。使用using 声明性将名称从基类引入派生类。

    class Derived : public Base< Derived >
    {
    public:
    
        using Base<Derived>::Func;
    
         //rest..
    };
    

    【讨论】:

    • 哦该死的......我认为它只会隐藏如果它采用相同的参数......多么痛苦:(是否可以使用“使用 Base"?
    • @Goz: using 声明式将 name 带入范围。所以你必须提到哪个名字。
    • 而这对我的问题来说是一个“否”……虽然必须为每个函数都加上 using 语句似乎很痛苦:(
    • @Goz:不是每个函数。它是每个name,即using Base&lt;Derived&gt;::Func; 会将具有same 名称的所有成员(无论是函数、数据还是类型)​​带到当前范围。
    • 唉,就我而言,这将是每个功能:(
    猜你喜欢
    • 2016-06-21
    • 2011-03-14
    • 2012-04-30
    • 2013-02-15
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多