C++ GCC共享\u ptr模板错误

C++ GCC共享\u ptr模板错误,c++,templates,g++,shared-ptr,C++,Templates,G++,Shared Ptr,以下函数 #include <memory> template<typename T> std::shared_ptr<typename T> Tail(const std::shared_ptr<typename T>& cont, size_t n) { const auto size(std::min<size_t>(n, cont->size())); return std::shared_ptr&l

以下函数

#include <memory>

template<typename T>
std::shared_ptr<typename T> Tail(const std::shared_ptr<typename T>& cont, size_t n)
{
   const auto size(std::min<size_t>(n, cont->size()));
   return std::shared_ptr<typename T>(new T(cont->end() - size, cont->end()));
}
我知道cont“看起来”不像指针,但它在VS2012上编译得很好。
如何为gcc编写函数?

只需删除那些额外的
typename
s即可

template<typename T>
std::shared_ptr<T> Tail(const std::shared_ptr< T>& cont, size_t n)
{
   const auto size(std::min<size_t>(n, cont->size()));
   return std::shared_ptr< T>(new T(cont->end() - size, cont->end()));
}
模板
std::shared_ptr Tail(常数std::shared_ptr&cont,大小)
{
常量自动大小(std::min(n,cont->size());
返回std::shared_ptr(新的T(cont->end()-size,cont->end());
}

您过度使用了
typename
关键字。代码应如下所示:

template<typename T>
std::shared_ptr<T> Tail(const std::shared_ptr<T>& cont, size_t n)
{
   const auto size(std::min<size_t>(n, cont->size()));
   return std::shared_ptr<T>(new T(cont->end() - size, cont->end()));
}
模板
std::shared_ptr Tail(常数std::shared_ptr&cont,大小)
{
常量自动大小(std::min(n,cont->size());
返回std::shared_ptr(新的T(cont->end()-size,cont->end());
}

有关进一步的讨论,请参见

您不必在每次使用参数之前重写
typename
,因此请将其更改为:

template<typename T>
std::shared_ptr<typename T> Tail(const std::shared_ptr<T>& cont, size_t n)
{
   const auto size(std::min<size_t>(n, cont->size()));
   return std::shared_ptr<typename T>(new T(cont->end() - size, cont->end()));
}
模板
std::shared_ptr Tail(常数std::shared_ptr&cont,大小)
{
常量自动大小(std::min(n,cont->size());
返回std::shared_ptr(新的T(cont->end()-size,cont->end());
}

这与类的问题是一样的,你不需要编写
void myfunc(class MyClass&m){}
,而只需编写
void myfunc(class MyClass&m){}

谢谢你的回答,为什么?你根本不需要它们
template<typename T>
std::shared_ptr<typename T> Tail(const std::shared_ptr<T>& cont, size_t n)
{
   const auto size(std::min<size_t>(n, cont->size()));
   return std::shared_ptr<typename T>(new T(cont->end() - size, cont->end()));
}