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

詳細については、「template」キーワードと「typename」キーワードをどこに、なぜ配置する必要があるのですか? を参照してください。

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

これはつまり、クラスと同じ問題です。書くのではなくvoid myfunc(class MyClass &m){}、単純にvoid myfunc(MyClass &m){}

于 2013-03-26T07:32:15.880 に答える