(MSVC) 在 class 之外实现模板 class 的模板方法时,C2244:无法将函数定义与现有声明相匹配
(MSVC) When implementing template method of template class outside of the class, C2244: Unable to match function definition to an existing declaration
运行 一些代码在 GCC 和 Clang 上编译,但在 MSVC (VS2022) 上编译时出现问题。看起来和很像,但那是几年前的事了,这个问题是因为在方法模板中使用了derived_from_specialization_of
,所以我不确定是不是同一个问题。
我想知道这是什么原因,问题是出在我的代码还是 MSVC 上。
示例:
#include <concepts>
template <template <class...> class Template, class... Args>
void derived_from_specialization_impl(const Template<Args...>&);
template <class T, template <class...> class Template>
concept derived_from_specialization_of = requires(const T& t) {
derived_from_specialization_impl<Template>(t);
};
template <class T>
class A
{
public:
A() = default;
};
template <derived_from_specialization_of<A> T>
class B;
template <derived_from_specialization_of<B> T>
class C
{
public:
C() = default;
};
template <derived_from_specialization_of<A> T>
class B
{
public:
B() = default;
template <derived_from_specialization_of<B> U>
C<U> Foo();
template <derived_from_specialization_of<B> U>
C<U> Bar()
{
return C<U>();
}
};
template <derived_from_specialization_of<A> T>
template <derived_from_specialization_of<B> U>
C<U> B<T>::Foo()
{
return C<U>();
}
what the reason for this is, and if the issue is with my code or MSVC.
这似乎是 MSVC 中的错误。您已经为成员函数模板 Foo<>
.
正确提供了 out-of-class 定义
使用 auto
和 尾随 return 类型 似乎无法解决 msvc 中的问题。您可以为此提交 bug report。
运行 一些代码在 GCC 和 Clang 上编译,但在 MSVC (VS2022) 上编译时出现问题。看起来和derived_from_specialization_of
,所以我不确定是不是同一个问题。
我想知道这是什么原因,问题是出在我的代码还是 MSVC 上。
示例:
#include <concepts>
template <template <class...> class Template, class... Args>
void derived_from_specialization_impl(const Template<Args...>&);
template <class T, template <class...> class Template>
concept derived_from_specialization_of = requires(const T& t) {
derived_from_specialization_impl<Template>(t);
};
template <class T>
class A
{
public:
A() = default;
};
template <derived_from_specialization_of<A> T>
class B;
template <derived_from_specialization_of<B> T>
class C
{
public:
C() = default;
};
template <derived_from_specialization_of<A> T>
class B
{
public:
B() = default;
template <derived_from_specialization_of<B> U>
C<U> Foo();
template <derived_from_specialization_of<B> U>
C<U> Bar()
{
return C<U>();
}
};
template <derived_from_specialization_of<A> T>
template <derived_from_specialization_of<B> U>
C<U> B<T>::Foo()
{
return C<U>();
}
what the reason for this is, and if the issue is with my code or MSVC.
这似乎是 MSVC 中的错误。您已经为成员函数模板 Foo<>
.
使用 auto
和 尾随 return 类型 似乎无法解决 msvc 中的问题。您可以为此提交 bug report。