2

以下函数

#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()));
}

在 gcc 4.7.2 上产生以下错误。

g++ test.cpp -std=c++0x
test.cpp:4:27: error: template argument 1 is invalid
test.cpp:4:66: error: template argument 1 is invalid
test.cpp: In function ‘int Tail(const int&, size_t)’:
test.cpp:6:42: error: base operand of ‘->’ is not a pointer
test.cpp:7:35: error: template argument 1 is invalid
test.cpp:7:47: error: base operand of ‘->’ is not a pointer
test.cpp:7:67: error: base operand of ‘->’ is not a pointer

我知道 cont 并不“看起来”像一个指针,但这在 VS2012 上编译得很好。如何为 gcc 编写函数?

4

3 回答 3

3

只需删除那些多余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()));
}
于 2013-03-26T07:30:26.123 回答
2

您过度使用了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()));
}

如需进一步讨论,请参阅在何处以及为什么必须放置“模板”和“类型名称”关键字?

于 2013-03-26T07:31:44.020 回答
0

您不必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()));
}

这与 ie 类的问题相同,您不写void myfunc(class MyClass &m){},而只是简单地void myfunc(MyClass &m){}

于 2013-03-26T07:32:15.880 回答