假设以下示例:
#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