【问题标题】:Bizarre template error message with gcc 4.6gcc 4.6的奇怪模板错误消息
【发布时间】:2012-10-07 23:37:21
【问题描述】:

我从 gcc 4.6 收到关于模板成员函数的真正奇怪的错误消息。这是一个最小的例子:

template<typename T>
class Pimpl
{
public:
    Pimpl(const Pimpl&) {}

private:
    T* clone_(const T*);
};

template<typename T>
template<typename P>
T*
Pimpl<T>::clone_(const T*)
{
    return new P(static_cast<const P&>(*p));
}

这是错误:

$ c++ -c y.cpp
y.cpp:14:1: error: prototype for ‘T* Pimpl<T>::clone_(const T*)’ does not match any in  class ‘Pimpl<T>’
y.cpp:8:8: error: candidate is: T* Pimpl<T>::clone_(const T*)

请注意,不匹配的原型与候选原型完全相同。

什么给了?

【问题讨论】:

  • 不,不是。候选者不是成员模板。
  • 那个“克隆”功能似乎根本没有任何意义。它更像是一个“转换和分配”功能。

标签: c++ templates gcc4


【解决方案1】:

它们因template &lt;typename P&gt; 而不同。 Comeau 错误消息(在http://www.comeaucomputing.com/tryitout 生成)突出显示了您遇到的问题:

error: template nesting depth does not match the previous declaration of function "Pimpl<T>::clone_"

值得一提的是:

(a) Comeau 编译器以产生特别好的错误消息而闻名。

(b) 使用多个编译器进行编译通常会给您提供其他情况下可能没有的见解。

【讨论】:

    【解决方案2】:

    如果你想要一个成员模板,你必须这样声明它:

    template <typename T>
    class Pimpl
    {
        // ...
    
        template <typename P>
        static P * clone(T const * p)
        {
            return new P(static_cast<P const &>(*p));
        }
    };
    

    我还制作了成员模板static,因为它似乎不依赖于对象实例,并且我将其定义为内联,因为无论如何您都必须在标题中提供模板定义,并且我修复了返回类型. (但我看不出模板化的clone 函数有什么意义......)

    【讨论】:

    • 啊,谢谢!我知道staticinline。我只是把它简化为尽可能简单的东西。 clone_ 函数出现在 pimpls 和不完整类型的上下文中。请参阅 Alan Griffith 的 Grin_ptr: link
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多