-1

基本上我有一个很好的可变参数类,除了“启用从这个共享”部分。

template <typename S>
class Test;

template <typename... Args>
class Test < void( Args...)>: 

        public std::enable_shared_from_this
        < Test< void(Args...)> >
{

    public:
        std::shared_ptr< Test< void( Args...)>> getptr();

};

template <typename... Args>
std::shared_ptr< Test< void( Args...)>>  Test < void( Args...)>::getptr(){
    return shared_from_this(); // error here!
}

我收到此错误:

there are no arguments to 'shared_from_this' that depend on a template parameter, 
so a declaration of 'shared_from_this' must be available [-fpermissive]
4

2 回答 2

4

你需要

return this->shared_from_this();

(假设其余的只是拼写错误,这很可能是因为您收到了错误消息。您显然需要从 派生std::enable_shared_from_this< Test< void(Args...)> >

于 2013-09-29T20:26:06.483 回答
3

您的代码中有几个拼写错误:

  • 您缺少类键(structclass(现已修复)
  • 必须修复 CRTP(现在已修复)
  • shared_from_this不是依赖名称,但基类 ( enable_shared_from_this) 是,因此在使用非依赖非限定查找时,不会在此基类范围内查找该名称(如shared_from_this())。您需要使查找合格或依赖才能找到此成员函数。

编译示例:

#include <memory>

template <typename S>
class Test;

template <typename... Args>
class Test < void( Args...)>
    : public std::enable_shared_from_this < Test<void(Args...)> >
{
public:
    std::shared_ptr< Test<void( Args...)> > getptr();
};

template <typename... Args>
std::shared_ptr< Test<void(Args...)> >  Test<void(Args...)> :: getptr()
{
    return this->shared_from_this(); // `this` makes the lookup dependent
    // alternatively:
    // return std::enable_shared_from_this< Test<void(Args...)> >
    //        ::shared_from_this();
}

int main()
{
    auto x = std::make_shared< Test<void(int)> >();
    x->getptr();
}
于 2013-09-29T20:26:47.793 回答