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
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