我一直在努力创建一个 generic
类来表示一系列值,但是在尝试找出我所缺少的内容时遇到了一些困难(编译器有关于缺少复制构造函数,但我尝试过的所有实现都失败了)。所以我的问题:
这是我的代码:
namespace MyNamespace {
generic<typename T> public ref class Range
{
protected:
T m_min;
T m_max;
public:
Range(T min, T max)
{
m_min = min;
m_max = max;
}
property T Min {
T get() { return m_min; }
void set(T min) { m_min = min; }
}
property T Max {
T get() { return m_max; }
void set(T max) { m_max = max; }
}
};
public ref class MyClass
{
protected:
Range<int> m_myRange;
public:
property Range<int> MyRange
{
Range<int> get() { return m_myRange; }
void set( Range<int> myRange ) { m_myRange = myRange; }
}
}
}
编译器在 Range
类中抱怨复制构造函数:
1>c:\projects\collections\Range.h(71) : error C2440: 'return' : cannot convert from 'MyNamespace::Range<T>' to 'ZephIRControlsLib::Range<T>'
1> with
1> [
1> T=int
1> ]
1> Cannot copy construct class 'MyNamespace::Range<T>' due to ambiguous copy constructors or no available copy constructor
1> with
1> [
1> T=int
1> ]
1>c:\projects\collections\Range.h(72) : error C2582: 'operator =' function is unavailable in 'MyNamespace::Range<T>'
1> with
1> [
1> T=int
1> ]
1>.\Range.cpp(8) : error C2512: 'MyNamespace::Range<T>' : no appropriate default constructor available
1> with
1> [
1> T=int
1> ]
答案 0 :(得分:1)
为什么需要一系列值?
如何使用Boost.Range来表示集合中的范围?如果您只对min和max感兴趣,请考虑std :: numeric_limits。
答案 1 :(得分:1)
我找出了似乎有用的缺失部分:
namespace MyNamespace {
generic<typename T> public ref class Range
{
protected:
T m_min;
T m_max;
public:
Range()
{
}
Range(T min, T max)
{
m_min = min;
m_max = max;
}
Range(Range<RangeType>% rhs)
{
m_min = rhs.m_min;
m_max = rhs.m_max;
}
Range% operator=(Range<RangeType>% rhs)
{
m_min = rhs.m_min;
m_max = rhs.m_max;
return *this;
}
property T Min {
T get() { return m_min; }
void set(T min) { m_min = min; }
}
property T Max {
T get() { return m_max; }
void set(T max) { m_max = max; }
}
};
public ref class MyClass
{
protected:
Range<int> m_myRange;
public:
property Range<int> MyRange
{
Range<int> get() { return m_myRange; }
void set( Range<int> myRange ) { m_myRange = myRange; }
}
}
}
答案 2 :(得分:1)
杀死过度工程并使其成为带有2个公共成员的模板化结构,min和max。这将更容易阅读,你不必为你可以直接设置的东西编写一堆单元测试。
还要认真考虑使用“开始”和“结束”的半开区间的STL范例。这实际上有助于范围合并在范围相邻时对浮点有一定的逻辑意义。