[英]C++ odd template issue
我有一个嵌套类型的类,以便允许类模板共享一个静态互斥锁:
template<int ID = 0>
class single_lockable
{
static std::mutex M_mu;
protected:
class single_lock :public std::lock_guard<std::mutex>
{
public:
single_lock()
:std::lock_guard<std::mutex>(M_mu)
{
}
};
};
template<int ID>
std::mutex single_lockable<ID>::M_mu;
和流包装器,以保证线程安全:
template<ostream& stream, int ID = 0>
class thread_safe_stream_wrapper :public single_lockable<ID>
{
...
typedef typename single_lockable<ID>::single_lock single_lock;
public:
...
thread_safe_stream_wrapper<stream,ID>& operator<<(const std::string& Arg)
{
M_stringbuilder << Arg;
if (Arg[Arg.length() - 1] == '\n')
{
single_lock lock();
stream << M_stringbuilder.str();
M_stringbuilder.str(std::string());
}
return *this;
}
};
thread_safe_stream_wrapper<std::cout> thread_safe_cout;
thread_safe_stream_wrapper<std::cerr> thread_safe_cerr;
但是,我在single_lock lock();
上遇到了麻烦single_lock lock();
:
GCC: error: default argument for template parameter for class enclosing 'thread_safe_stream_wrapper<stream, ID>::single_lock lock()'
MSVC: warning C4930: 'single_lockable<0>::single_lock lock(void)': prototyped function not called (was a variable definition intended?)
如果我改变它,它运作良好:
single_lock lock;
你能解释一下为什么会这样吗? 我认为A a;
之间没有任何区别A a;
和A a();
如果A是一个班级。 我错过了一些重要的语法点吗? 谢谢。
我认为
A a;
之间没有任何区别A a;
和A a();
如果A
是一个班级
你错了。
我错过了一些重要的语法点吗?
single_lock lock()
是一个函数声明。 是的,甚至在功能体内!
实际上,错误消息在其文本中表明了这一点:
原型函数未被调用(是一个变量定义?)
是的! 写single_lock lock;
这与最令人烦恼的解析有关 ,但并不复杂。
代替
single_lock lock();
采用
single_lock lock;
或者奖励C ++ 11-ness
auto lock = single_lock{};
这三个是等价的,第一种形式很容易被解释为一个函数声明(“最令人烦恼的解析” - 如果解析器将其解释为函数说明,则它将高于一切)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.