为什么是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;
1条答案
按热度按时间6jygbczu1#
为什么B::bar ==为真,如何解决这个问题?
因为你没有正确地显式专用化
bar
。特别是,为了显式专用化bar
,我们必须使用2个template<>
,一个用于封装类模板,另一个用于bar
本身(因为它也是模板化的)。因此,要解决此问题,请进行以下更改:
Working demo