c++ 包含模板成员的模板类的专用化不起作用

vql8enpb  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(158)

为什么是B<int>::bar<int> == true以及如何解决这个问题?
编辑:看起来问题在于B专门化不正确

#include <iostream>

template <class T>
struct A {
  static bool foo;
};

template <class T>
struct B {
  template <class U>
  static bool bar;
};

// assigning default values (works as expected)
template <class T>
bool A<T>::foo = true;

template <class T> template <class U>
bool B<T>::bar = true;

// template specialization
template <>
bool A<int>::foo = false; // works as expected

template <> template <class U>
bool B<int>::bar = false; // not working

int main() {
  std::cout << A<char>::foo << '\n';       // 1
  std::cout << A<int>::foo << '\n';        // 0   works fine
  std::cout << B<char>::bar<char> << '\n'; // 1
  std::cout << B<int>::bar<int> << '\n';   // 1   why is it true?
}

看起来由于某种原因,这些代码行没有将B<int>::bar<int>设置为false

template <> template <class U>
bool B<int>::bar = false;
6jygbczu

6jygbczu1#

为什么B::bar ==为真,如何解决这个问题?
因为你没有正确地显式专用化bar。特别是,为了显式专用化bar,我们必须使用2个template<>,一个用于封装类模板,另一个用于bar本身(因为它也是模板化的)。
因此,要解决此问题,请进行以下更改:

template <> template <>
bool B<int>::bar<int> = false; // works now
int main() {
  
  std::cout << B<int>::bar<int> << '\n';   // prints 0
}

Working demo

相关问题