相关疑难解决方法(0)

为什么GCC不能消除多个继承函数的歧义(但是clang可以)?

可能重复:
为什么具有相同名称但签名不同的多重继承函数不会被视为重载函数?

这无法使用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

12
推荐指数
1
解决办法
799
查看次数

成员`...'的请求在g ++中是不明确的

我在我的一个类中使用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)

和 …

c++ gcc g++ ambiguous

10
推荐指数
1
解决办法
1万
查看次数

C++ 11:消除多重继承中的类成员的歧义

假设我有这个可变参数的基类模板:

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都抱怨模糊的电话.

我的问题是双重的:

  1. 为什么编译器无法解决这种歧义(一般兴趣)? …

c++ multiple-inheritance ambiguity enable-if c++11

6
推荐指数
1
解决办法
1479
查看次数