在下面的代码中,main()中的'bObj-> b()'行进行了编译,但'cObj-> c()'行给出了一个错误'在'>'标记之前的预期主表达式”。这与依赖类型无关。在适当的位置添加"template"或"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>();
}

最佳答案

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

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

此外:



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



您最了解您的代码。我们无法对看不见的事物做出假设。如果此答案不能解决您的问题,我认为您应该针对“实际”代码的作用生成一个更具代表性的示例,可能将其简化为SSCCE

09-15 20:12