繁体   English   中英

C ++奇怪的模板问题

[英]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{};

这三个是等价的,第一种形式很容易被解释为一个函数声明(“最令人烦恼的解析” - 如果解析器将其解释为函数说明,则它将高于一切)。

见这里: http//herbsutter.com/2013/05/09/gotw-1-solution/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM