C ++模板特化的定义在预期时不起作用

时间:2018-04-20 16:18:38

标签: c++ c++11 templates

这是this question的后续行动。该问题的答案与宣传的一样有效。但是,我很难将它应用到我的实际代码中。我现在有一个不起作用的例子,但我认为与前一个问题的答案相符。

#include <type_traits>

namespace Internal
{
    template <template<typename...> class TT, typename T>
    struct IsInstantiation : std::false_type {};

    template <template<typename...> class TT, typename... Ts>
    struct IsInstantiation<TT, TT<Ts...>> : std::true_type {};

    template <typename T1, typename = void>
    struct MyClass
    {
        void func(int i);
    };

    template <typename T1>
    struct MyClass<T1, std::enable_if_t<IsInstantiation<MyClass, T1>::value>>
    {
        void func(int i);
    };
}

template <typename T1, typename T2>
inline void Internal::MyClass<T1, T2>::func(int i) {}

template <typename T1>
inline void Internal::MyClass<T1, std::enable_if_t<Internal::IsInstantiation<Internal::MyClass, T1>::value>>::func(int i) {}

int main(int argc, char *argv[])
{
    Internal::MyClass<int> mc1;
    Internal::MyClass<Internal::MyClass<int>> mc2;

    mc1.func(0);
    mc2.func(0);
}

我正在使用VS2015 Update 3编译此代码。在func的第二个定义中,它会出现以下错误:

  
      
  • void Internal::MyClass<T1,<unnamed-symbol>>::func(int):功能模板已定义
  •   
  • Internal::MyClass<T1,<unnamed-symbol>>:模板参数太少
  •   

我错过了什么导致它无法编译?

1 个答案:

答案 0 :(得分:0)

这已被确认为VC ++错误。它应该在VC ++ 2017的(近)未来更新中修复。 https://developercommunity.visualstudio.com/content/problem/237932/function-definition-of-template-specialization-not.html