使用类型参数(VC ++ v140工具集)专门化部分模板参数

时间:2017-06-12 10:14:18

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

我尝试构建一个像下面这样的部分模板特化(这在这个简短的形式中没有意义,但它减少了问题):

#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的已知问题吗?

提前致谢, 克里斯托弗

2 个答案:

答案 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::xA::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
{
};