我尝试构建一个像下面这样的部分模板特化(这在这个简短的形式中没有意义,但它减少了问题):
#include <iostream>
#include <string>
template<class C> struct A {
int x;
std::basic_string<C> y;
};
template <class C, class T>
struct B { B(void) { std::cout << "default "; }; };
template<class C>
struct B<C, decltype(A<C>::x)> { B(void) { std::cout << "int "; }; };
template<class C>
struct B<C, decltype(A<C>::y)> { B(void) { std::cout << "string "; }; };
int main() {
B<char, int>{};
B<char, std::string>{};
B<wchar_t, std::wstring>{};
}
VC ++编译器( v140 工具集)抱怨部分模板特化说它们是重复的:
错误C2953:&#39; B&#39;:类模板已经定义
我的第一个问题是:上面的代码是符合标准的吗,即应该编译吗?
如果我将工具集切换到 Visual Studio 2015 - Clang with Microsoft CodeGen(v140_clang_c2),它会编译并运行预期的输出&#34; int string string&#34;,所以我的假设是第一个问题的答案是&#34;是&#34;,因为T
不是非类型。
因此第二个问题:是否有可能重新编写代码,以消除对C
的依赖,这似乎会使VC ++中断?
第三个问题:这是VC ++ v140的已知问题吗?
提前致谢, 克里斯托弗
答案 0 :(得分:1)
这不是partial class template specialization的语法。这是:
template <class T, class U>
class Traits { };
template <class T> // one template parameter
class Traits<T, decltype(A<T>::x)> { };
// ^^^^^^^^^^^^^^^^^^^^
template <class T>
class Traits<T, decltype(A<T>::y)> { };
您还必须访问A::x
和A::y
。
答案 1 :(得分:-1)
除了缺少的类关键字和分号之外,这是显式完整类模板特化的示例:
#include <iostream>
template<typename T> // primary template
struct is_void : std::false_type
{
};
template<> // explicit specialization for T = void
struct is_void<void> : std::true_type
{
};