我试图用指针类型的非类型模板参数来创建一个类模板,它有两个针对const和not-const指针的专门化。
这是我最好的尝试,被Clang和GCC接受:
template <const int*>
struct A {};
template <int* p>
struct A<p>;
int v;
A<&v> a;
字符串
但是A<&v>
仍然使用带有const指针的主模板,尽管&v
的类型是int*
。
另一方面,MSVC打印:
error C2753: 'A<p>': partial specialization cannot match argument list for primary template
型
在线演示:https://godbolt.org/z/EzoYoxEza
我的部分特化正确吗?如果正确,我如何使用A<int*>
?
2条答案
按热度按时间3phpmpom1#
如前所述,这是一个MSVC bug。在C++20中,有一个相对优雅的解决方法:
字符串
在这种情况下,MSVC确实正确地选择了
const int*
和int*
专门化;请参阅live example at Compiler Explorer。请注意,由于备忘录错误(Bug 113274),此解决方案目前不适用于GCC,因此您可能必须完全求助于其他解决方案。
你也可以使用
#ifdef __GNUC__
来使用你的原始版本,而不是MSVC,并且只使用这个版本来使用MSVC。这个解决方案绝对令人厌恶和疯狂,但似乎是唯一的方法来保持所有编译器的模板参数列表干净。c9x0cxw02#
这是MSVC中的一个bug。您可以使用以下解决方法来编译它而不会出错:
字符串
有关此错误的更多信息,请访问:Non type template parameter in msvc does not compile