我面临以下问题:我有一个V类(例如向量),可以从中生产两个类:CI和我(想到const_iterator和Iterator)。如果我有const v,那么我只能产生CI(再次想到迭代器和const_iterator)。

从本质上讲,我想与(CI CI)和(V&V)一起使用(i i)。此外,我希望仍然能够将V OBJ直接传递给期望i或a ci的函数,从而从v和const v到CI和I。

我面临的问题是,尽管超载功能可以区分(const v&v)和(v&v),但它们不能在(CI CI)和(i)之间“区分”(i)。

在代码中:

struct V {};

struct I 
{
    I( V& v ){}
};

struct CI
{
    CI( const V& v ){} //I would like to say const only 
};

void fun( I i )
{
    double x = 1.0;
}
void fun( CI ci )
{
    double x = 2.0;
}

void fun2( V& v )
{
    double x = 1.0;
}
void fun2( const V& v )
{
    double x = 2.0;
}

请注意,我可以在v中定义转换操作员(是否等效?),而不是定义CI和I中的构造函数。现在:

V v;
const V cv;

fun2( v );
fun2( cv );

fun( v ); //AMBIGUOUS!
fun( cv );

有没有办法在不添加任何额外间接的情况下解决此问题(即无法修改娱乐功能,并且必须将V直接传递给Fun,但您可以自由修改所有其他内容)。

预先感谢您的任何帮助!

有帮助吗?

解决方案

您需要的是明确的构造函数:

struct I 
{
    explicit I( V& v ){}
};

struct CI
{
    explicit CI( const V& v ){} //I would like to say const only 
};

太多的C ++程序员忽略了构造函数的明确关键字。默认情况下应明确所有一元,参数化的构造函数。隐式构造仪会引发诸如此类的歧义问题,并导致非常愚蠢的回旋处转换过程,这些转换过程很容易导致有问题且效率低下的代码。

现在您已经解决了,歧义问题解决了。没有明确的构造函数,您将无法防止这种歧义问题。

对于客户端代码,您确实需要对其进行修改以明确有关其转换:

V v;
const V cv;

fun2( I(v) );
fun2( CI(cv) );

fun( I(v) );
fun( CI(cv) );

现在需要这种语法来构建I或CI的对象,但这是一件好事:没有人可以意外地引入歧义问题。

其他提示

只使用 typedefs?

typedef V& I;
typedef const V& CI;

编辑:

否。请参阅评论:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top