我有两个对象和一个模板类的结构模板。我希望这个结构体可以作为类对象的类型之一,我希望类的函数能够操作它们。对于相同的类型,我希望这个类能够操作标准的CPP类型,比如int和float。
template<typename T>
struct user_type
{
T obj1;
T obj2;
};
template<class T>
class array
{
int length;
T* ar_ptr;
public:
void setArray();
};
template<class T> void array<T>::setArray()
{
for(int i = 0; i < length; ++i)
{
(*(ar_ptr+ i)).obj1 = 0;
(*(ar_ptr+ i)).obj2 = 0;
}
}
template <typename T>
void array<T>::setArray()
{
for(int i = 0; i < length; ++i)
{
*(ar_ptr+ i) = 0;
}
}
我试图给予set函数两个不同的声明,但我得到了以下错误:
error: redefinition of 'setArray'
error: member reference base type 'float' is not a structure or union
声明这个函数并示例化它的正确方法是什么?我希望用同一个类来操作一个结构和一个启动CPP类型。
2条答案
按热度按时间fhg3lkii1#
你的设计似乎有冲突,或者你误解了你的任务/练习或设计。类型
array<T>
不能容纳user_type<T>
对象。也许你误解了模板类型T
,这两个模板(和其他模板)都可以不同?我猜你真正需要和想要的是这样的:
然后对于“normal”类型,你可以像“normal”一样创建你的数组示例:
对于
user_type
模板,您使用示例化的user_class
模板作为类型(本示例使用user_type<int>
使结构int
的两个成员都成为变量):在这两种情况下,你都可以调用
setArray
,“正确”的事情应该会发生:zwghvu4y2#
如何编写一个模板函数来处理结构体和CPP类型(如
float
)?方法一:简体中文
一种方法是使用
constexpr if
和std::is_arithmetic_v
,如下所示:Demo
方法二:C++20
这使用了
requires
子句。working demo