gpt4 book ai didi

c++ - 如何在 C++ 中的类体之外定义一个专门的类方法?

转载 作者:行者123 更新时间:2023-12-04 11:52:20 27 4
gpt4 key购买 nike

我有一个模板类 A<T>及其对整数参数的特化。并且类及其特化都声明了方法 foo() ,我想在类主体之外定义:

#include <concepts>

template<class T>
struct A { static void foo(); };

template<std::integral T>
struct A<T> { static void foo(); };

template<class T>
void A<T>::foo() {}

template<std::integral T>
void A<T>::foo() {}

int main() { A<int>::foo(); }
GCC 接受此代码。
Clang 打印错误 https://gcc.godbolt.org/z/hYfYGPfMh :
error: type constraint differs in template redeclaration
template<std::integral T>
MSVC 会在两个方法定义上打印错误:
error C3855: 'A<T>': template parameter 'T' is incompatible with the declaration
error C2447: '{': missing function header (old-style formal list?)
error C2065: 'foo': undeclared identifier
请建议如何在类体之外定义方法并使所有编译器满意?

最佳答案

我不是 C++ 模板专家,我尝试过类似下面的方法

template<class T, bool = std::is_integral_v<T>>
struct A
{};

template<class T>
struct A<T, false>
{
static void foo();
};

template<class T>
struct A<T, true>
{
static void foo();
};

template<class T>
void A<T,false>::foo()
{
std::cout << "I am working on a non-integral type" << std::endl;
}

template<class T>
void A<T, true>::foo()
{
std::cout << "I am working on an integral type" << std::endl;
}

int main()
{
A<int>::foo();
A<float> ::foo();

return 0;
}
代码给了我 MS C++ 编译器的结果
I am working on an integral type
I am working on a non-integral type

关于c++ - 如何在 C++ 中的类体之外定义一个专门的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68589314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com