在下面的代码中,main()中的'bObj-> b()'行编译,但'cObj-> c()'行在'>'之前给出错误'期望的primary-expression'令牌”。这与依赖类型无关;在适当的位置添加“模板”或“typename”无济于事。什么问题是什么提示?在此代码的“真实”版本中,还有许多其他模板和非模板版本的函数“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>();
}
答案 0 :(得分:4)
C
没有成员函数模板,只有常规成员函数。因此,在调用C::b()
:
cObj->b<D>(); // ERROR!
cObj->b(); // OK
此外:
在此代码的“真实”版本中,还有许多其他模板和非模板版本的函数“b”。
然后,您提供的代码很可能不是您在代码的“真实”版本中遇到的问题的一个很好的例子。
问题可能只发生在一个地方,而不是其他地方,但我无法确定可能存在的重要区别。
您最了解您的代码。我们不能对我们看不到的东西做出假设。如果这个答案没有解决您的问题,我认为您应该为您的“真实”代码做出更具代表性的示例,可能会将其降低到SSCCE。