这无法使用g ++ 4.6.1在指定的位置进行编译:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void operator()(Ea) {} };
struct Sb { void operator()(Eb) {} };
struct Sbroken : Sa, Sb {};
struct Sworks {
void operator()(Ea) {}
void operator()(Eb) {}
};
int main() {
Sworks()(Ea0);
Sbroken()(Ea0); // g++ can't disambiguate Ea vs. Eb
}
Run Code Online (Sandbox Code Playgroud)
Clang 2.8确实编译了这段代码,这让我不确定代码是否真的有效C++.我乐观地总结出clang是对的并且g ++是错误的,但后来我做了一个小改动,使得clang有类似的错误:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void f(Ea) {} };
struct Sb …Run Code Online (Sandbox Code Playgroud) c++ overloading operator-overloading multiple-inheritance ambiguous
我在我的一个类中使用gcc 3.4.5(mingw)得到以下编译错误:
src/ModelTester/CModelTesterGui.cpp:1308: error: request for member `addListener' is ambiguous
include/utility/ISource.h:26: error: candidates are: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SConsolePacket&]
include/utility/ISource.h:26: error: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SControlPacket&]
Run Code Online (Sandbox Code Playgroud)
希望你能看到这ISource<T>是一个模板接口,它只是表明该对象可以是某个匹配类型的对象的informer IListener<T>.让我烦恼的是这个想法,由于某种原因,功能是模棱两可的,据我所知,它们不是.addListener()对于不同的输入类型IListener<const SConsolePacket&>,该方法会被重载IListener<const SControlPacket&>.用法是:
m_controller->addListener( m_model );
Run Code Online (Sandbox Code Playgroud)
m_model指向IRigidBody对象的指针在哪里,并且IRigidBody仅从,IListener< const SControlPacket& >并且绝对不是从IListener< const SConsolePacket& >
作为一个完整性检查,我使用doxygen来生成类层次结构图,并且doxygen同意我的IRigidBody不同意IListener< const SConsolePacket& >
显然,我对c ++中的继承性的理解并不完全正确.我的印象是IListener<const SControlPacket&>,它IListener<const SConsolePacket&>是两种不同的类型,而且是函数声明
addListener(IListener<const SConsolePacket&>* listener)
Run Code Online (Sandbox Code Playgroud)
和 …
假设我有这个可变参数的基类模板:
template <typename ... Types>
class Base
{
public:
// The member foo() can only be called when its template
// parameter is contained within the Types ... pack.
template <typename T>
typename std::enable_if<Contains<T, Types ...>::value>::type
foo() {
std::cout << "Base::foo()\n";
}
};
Run Code Online (Sandbox Code Playgroud)
foo()只有在其template-parameter至少匹配其中一个参数Base(Contains此帖子底部列出的实现)时,才能调用该成员:
Base<int, char>().foo<int>(); // fine
Base<int, char>().foo<void>(); // error
Run Code Online (Sandbox Code Playgroud)
现在我使用非重叠类型集定义一个从Base继承两次的派生类:
struct Derived: public Base<int, char>,
public Base<double, void>
{};
Run Code Online (Sandbox Code Playgroud)
我希望在打电话的时候
Derived().foo<int>();
Run Code Online (Sandbox Code Playgroud)
编译器会找出要使用的基类,因为它是不包含的基类的SFINAE int.然而,GCC 4.9和Clang 3.5都抱怨模糊的电话.
我的问题是双重的: