2013-02-06 126 views
6

此代码unexplicably不编译:C++函数模板参数与模板化型结构愁楚

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

如果我改变#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 
+0

如果你完全运行你通过编译器发布的代码,你会得到那个错误吗? –

+0

@DavidRodríguez-dribeas http://ideone.com/N8dQoj(完全是问题的代码) – leemes

回答

6

您应该解决您的函数调用如下,加入template关键字:

T* get() { return m_ptr->template get<T>(); } 

您可以检查this link以获取对语法的解释。

8

这很难告诉你所有的类型定义,但我打赌你需要:

m_ptr->template get<T>(); 
+0

+1。 –

+0

但是...为什么? 'm_ptr'总是*'sometype *'。 – ipc

+1

@ipc他有'#if 1'这将是真实的,所以'm_ptr'是'typename some_wrapper :: type *',依赖类型 –