C++模板专业化和xcode

C++ templates specializations and xcode

本文关键字:xcode 专业化 C++      更新时间:2023-10-16

我从Xcode收到以下错误:

模板模板参数的模板参数必须是类模板或类型别名模板

然而,相同的代码在Visual Studio中也可以正常工作。

template< typename T_NODE, template< typename > class T_ALLOCATOR >
class qt_fixed_pool_general {};
template< template< typename, int > class T_ALLOCATOR, int T_COUNT >
struct static_to_dynamic
{ template< typename T_NODE > using t_allocator = T_ALLOCATOR< T_NODE,T_COUNT >; };
template< typename T_NODE, int T_COUNT >
struct safe_array {};
template< class T_NODE, int T_COUNT >
class qt_fixed_pool_static : public qt_fixed_pool_general< 
      T_NODE, 
      static_to_dynamic< safe_array, T_COUNT >::t_allocator >
{};

有什么想法吗?我使用的是Xcode 7.2

问题是,当解析(而不是实例化)模板时,编译器无法知道t_allocator将是一个模板,而不是静态数据成员。你必须告诉它:

template< class T_NODE, int T_COUNT >
class qt_fixed_pool_static : public qt_fixed_pool_general< 
      T_NODE, 
      static_to_dynamic< safe_array, T_COUNT >::template t_allocator >
{};                                           //^^^^^^^^

【实例】

注意在::t_allocator之间添加的template关键字。

这在Visual Studio中起作用的原因是VS在模板解析方面不符合标准(而且从来没有):它没有正确地进行两阶段查找,而是将所有名称解析推迟到实例化时,这样它就不会遇到这样的错误。