2

我从 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*)

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

是什么赋予了?

4

2 回答 2

3

它们之所以不同,是因为template <typename P>. Comeau 错误消息(在http://www.comeaucomputing.com/tryitout生成)突出显示了您遇到的问题:

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

值得一提的是:

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

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

于 2012-10-07T23:40:55.313 回答
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函数有什么意义......)

于 2012-10-07T23:41:16.860 回答