PDA

View Full Version : Q_DECLARE_OPERATORS_FOR_FLAGS causes breakage in other flags, example source provided



jkyle
17th May 2010, 20:58
When I declare operators for some of my custom flags, it causes some of the default flags to lose their operators. Below is an example that reproduces the issue (Qt 4.6/4.7).

Not sure if I've simply missed some caveat and, of course, in my actual app the MainWindow and Foo classes are in separate files as is the main().



#include <QList>
#include <QSet>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <QObject>
#include <QDockWidget>
#include <QMainWindow>

using namespace std;

namespace kex
{
class Foo
{
Q_FLAGS(NType NTypes)

public:
enum NType {
TypeOne = 0x1,
TypeTwo = 0x2,
};
Q_DECLARE_FLAGS(NTypes, NType)

void flagsFunc(NTypes nt)
{

}
};

Q_DECLARE_OPERATORS_FOR_FLAGS(Foo::NTypes)

class MyMainWindow : public QMainWindow
{
public:
MyMainWindow(QWidget *parent = 0) : QMainWindow(parent) {
/*
temp.cpp: In constructor 'kex::MyMainWindow::MyMainWindow(QWidget*)':
temp.cpp:38: error: conversion from 'int' to 'Qt::DockWidgetAreas' is ambiguous
/Library/Frameworks/QtCore.framework/Headers/qglobal.h:2169: note: candidates are: QFlags<Enum>::QFlags(void**) [with Enum = Qt::DockWidgetArea] <near match>
/Library/Frameworks/QtCore.framework/Headers/qglobal.h:2168: note: QFlags<Enum>::QFlags(Enum) [with Enum = Qt::DockWidgetArea] <near match>
*/
_dock.setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
}

private:
QDockWidget _dock;
};

};

int main ()
{
kex::Foo foo;
foo.flagsFunc(kex::Foo::TypeOne | kex::Foo::TypeTwo);
return 0

jkyle
19th May 2010, 19:17
Due to the nature of namspace lookups of operators, Q_DECLARE_OPERATORS_FOR_FLAGS must be declared globally.