模板化参数被模板化的模板化类特化:Visual Studio与g ++的区别

时间:2018-03-14 16:57:27

标签: c++ c++11 templates gcc visual-studio-2015

以下代码,我从中读取this,在gcc(link)中编译并运行良好,但在Visual Studio中出错。

  

错误C2910'my_property<A<U>>':无法明确专门化

只有删除template <>行才能正常工作。 我得到了解决方法here。解决方法版本也适用于g ++。

#include <iostream>
#include <type_traits>

template <typename T>
struct A {
  T x;
};

template <typename T>
struct my_property {
  static const bool value = false;
};

template <> //Remove this and it will work in Visual Studio
template <typename U>
struct my_property<A<U>> {
  static const bool value = true;
};

int main() 
{
  std::cout << std::boolalpha;
  std::cout << my_property<int>::value << '\n'; //false
  std::cout << my_property<A<int>>::value << '\n'; //true
  std::cout << my_property<A<float>>::value << '\n'; //true
}

哪种编译器是对的?

1 个答案:

答案 0 :(得分:2)

如果我正确阅读标准,则在这种情况下不应使用template<>

基本上,您必须为嵌套模板提供多个模板参数列表:

(见[temp.mem]§1)

  

可以在类或类模板中声明模板;这样的模板称为成员模板。可以在类定义或类模板定义之内或之外定义成员模板。在类模板定义之外定义的类模板的成员模板应使用类模板的模板参数,然后是成员模板的模板参数来指定。

...但需要提供额外的模板参数列表,以便使用模板参数专门化模板:

(见[temp.class.spec]§2)

  

每个类模板的部分特化都是一个独特的模板...

(然后是§4)

  

模板参数在紧跟在关键字模板后面的尖括号括起列表中指定。对于部分特化,模板参数列表紧跟在类模板名称后面显式写入。对于主模板,此列表由模板参数列表...

隐式描述

没有任何迹象表明需要额外的模板参数列表 - 专业化只是一个模板,因此它只需要一个参数列表。