重载的运算符和继承与模板(强大的组合)

EdF*_*EdF 7 c++ inheritance templates operator-overloading

问候所有.

我正在使用Boost Units库编写一些代码并遇到了问题.

我已经设法从Boost代码中抽象出问题所以你不会看到大量的boost模板元编程.虽然我确定你是否有经验,但它可以提供帮助.这是复制品:

class Base{};
class Derived : public Base
{
public:
  Derived(){}
  Derived(const Base &){}
};

class Q {};
class U
{
public:
  template< typename Y >
  Q operator * (Y)
  {
    Q r;
    return r;
  }
};

Base operator * (U, const Base &)
{
  Base r;
  return r;
}

int main(int argc, char **argv)
{
  Base myBase;
  U myU;
  Base myOtherBase = myU * myBase;
  Derived myDerived;
  Derived myOtherDerived =  myU * myDerived;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以问题(具体)如下:myU * myBase使用operator * (U, const Base &)和返回类型Base,到目前为止都是好的.而myU * myDerived坚持使用普遍U::operator * (Y),因此返回Q,没有好,因为我想一个Base试.

现在,除了Base和之外的所有类Derived都是提升库类,所以我无法修改U的成员.我如何"击败" U::operator * (Y)过载/模板演绎/实例化,在这种情况下,以优雅和"一劳永逸"的方式.

我正在使用MSVC++ 2008,以防它与任何人相关.

编辑:在答案中添加了一个可能的(很可能)解决方案

EdF*_*EdF 0

正当我昨晚放弃尝试解决这个问题时,答案却像一块砖头一样击中了我。的Q类型化结果在概念上与的类型化结果U::operator*(Base)相同,即使它们由不同的类型表示。我需要做的就是提供一个接受类型 Q 的构造函数。Baseoperator*(U,Base)Base ( const Q & )

class Base
{
public:
Base(){}
Base(const Q &){}
};
Run Code Online (Sandbox Code Playgroud)

这使得我的示例可以编译。现在看看我是否真的可以在真实版本中编写所需的构造函数(其中 aBase实际上是 aBase<Q,...>并且Q我们接受的是 a Q<Base,...>)。

不幸的是,提出问题的简化抽象示例使得发现这个解决方案变得更加困难,所以我有很大的优势。感谢所有提出想法/评论和答案的人。