4

在以下代码中,main() 中的 'bObj->b()' 行编译,但 'cObj->c()' 行给出错误 'expected primary-expression before '>' token'。这与依赖类型无关;在适当的位置添加“模板”或“类型名称”没有帮助。关于问题所在的任何提示?在此代码的“真实”版本中,函数“b”还有许多其他模板和非模板版本。问题可能只发生在一个地方而不是其他地方,但我无法确定可能是什么重要的区别。

#include <boost/shared_ptr.hpp>

class A {};
class D : public A {};

class B
{
public: 
        template <class T> boost::shared_ptr<T> b() { return boost::shared_ptr<T>(); }
};      

class C
{
public: 
        boost::shared_ptr<A> b() { return boost::shared_ptr<A>(); }
};      

int main(int, char **)
{       
        boost::shared_ptr<C> cObj(new C);
        boost::shared_ptr<B> bObj = boost::dynamic_pointer_cast<B>(cObj);

        bObj->b<D>();
        cObj->b<D>();
}    
4

1 回答 1

4

C没有成员函数模板,只有常规成员函数。因此,调用时不能提供模板参数C::b()

cObj->b<D>(); // ERROR!
cObj->b(); // OK

而且:

在此代码的“真实”版本中,函数“b”还有许多其他模板和非模板版本。

那么您提供的代码很可能不是您在代码的“真实”版本中遇到的问题的一个很好的例子。

问题可能只发生在一个地方而不是其他地方,但我无法确定可能是什么重要的区别。

最了解你的代码。我们不能对我们看不到的东西做出假设。如果此答案不能解决您的问题,我认为您应该制作一个更具代表性的示例来说明您的“真实”代码的作用,可能会将其简化为SSCCE

于 2013-02-22T20:06:31.963 回答