模板继承 - 受保护的基本成员未声明

时间:2014-05-02 07:50:29

标签: c++ templates inheritance

假设以下示例:

#include <iostream>
#include <mutex>

template< typename S >
class Base
{
public:
    Base () { std::cout << "hello" << std::endl; }
    virtual S get () { return S(5); }
protected:
    std::mutex mtx;
};

template< typename S >
class Derived : public Base< S >
{
public:
    using Base< S >::Base;
    virtual void lock () { std::unique_lock<std::mutex> lck(mtx); } // compilation error
};

int main ()
{
    Derived< int > d; // hello
    std::cout << d.get() << std::endl; // 5
    d.lock();

    return 0;
}

为什么g++编译器&#34;无法看到&#34;成员变量mtx ??

$ g++ -Wall -g -std=c++11 -o inher main.cpp
main.cpp: In member function ‘virtual void Derived<S>::lock()’:
main.cpp:19:65: error: ‘mtx’ was not declared in this scope
     virtual void lock () { std::unique_lock<std::mutex> lck(mtx); }
                                                             ^

即使mtx使用Base继承在public中声明受保护?根据{{​​3}}和其他人,派生类可以访问受保护的Base成员。

是模板问题吗?如何访问Base类的受保护成员?谢谢提示。

注意:示例即使我使用int代替std::mutex

也不起作用

0 个答案:

没有答案