C++函数模板参数与模板化类型struct woes

fin*_*ncs 6 c++ templates arguments function c++11

这段代码无法解释:

struct sometype
{
    template <typename T>
    T* get() { return nullptr; }
};

template <typename T>
struct anothertype
{
#if 1
    template <typename T2> struct some_wrapper { typedef T2 type; };
    typedef typename some_wrapper<sometype>::type thetype;
#else
    typedef sometype thetype;
#endif
    typedef thetype* Ptr;

    Ptr m_ptr;
    T* get() { return m_ptr->get<T>(); }
};
Run Code Online (Sandbox Code Playgroud)

如果我将#if参数更改为0,则会以某种方式修复.有人可以解释一下吗?请注意,显然毫无意义的some_wrapper事情实际上在我的真实代码中做了一些有用的事情.

我正在使用g ++ 4.7.1 -fstd=gnu++11,错误如下(指向我声明的行anothertype<T>::get:

error: expected primary-expression before '>' token
error: expected primary-expression before ')' token
Run Code Online (Sandbox Code Playgroud)

小智 8

用你所有的typedef很难说,但是你需要下注:

m_ptr->template get<T>();
Run Code Online (Sandbox Code Playgroud)

  • @ipc:什么不是立即显而易见的是为什么它会产生影响...它之所以重要的原因是`some_wrapper`实际上是'anothertype <T> :: some_wrapper`,因此依赖于`some_wrapper`的任何名称都变成了依赖名称,要解析依赖名称,您需要额外的`typename`和`template`关键字.[与`typedef typename中需要typename的方式完全相同some_wrapper <sometype> :: type thetype;`] (3认同)

And*_*owl 6

你应该修改你的函数调用,如下所示,添加template关键字:

T* get() { return m_ptr->template get<T>(); }
Run Code Online (Sandbox Code Playgroud)

您可以查看此链接以获取语法说明.