这是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>>
:模板参数太少
我错过了什么导致它无法编译?
答案 0 :(得分:0)
这已被确认为VC ++错误。它应该在VC ++ 2017的(近)未来更新中修复。 https://developercommunity.visualstudio.com/content/problem/237932/function-definition-of-template-specialization-not.html