Strona 1 z 1

Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 14:08
przez Cyfrowy Baron
Jak w temacie, otrzymuję komunikat: [BCC32 Error] DataCreate.cpp(149): E2015 Ambiguity between 'clMax' and 'Graphics::clMax'
Wiem co to oznacza, występuje tutaj dwuznaczność wartości clMax, występuje ona zarówno w przestrzeni nazw Graphics jak i (tutaj) w klasie TZipForge.

Błąd wywołuje ten fragment kodu:

Kod: Zaznacz cały
Archiver->CompressionLevel = clMax;


gdybym chciał użyć wartości clMax z przestrzeni nazw Graphics zrobiłbym to tak:

Kod: Zaznacz cały
Archiver->CompressionLevel = Graphics::clMax;


Niestety ja potrzebuję tej wartości z klasy TZipForge, tam występuje ona jako typ wyliczeniowy, więc w zasadzie nie mogę użyć jako odpowiednika wartości liczbowej, gdyż jej nie posiada.


#pragma option push -b-
enum TZFCompressionLevel { clNone, clFastest, clNormal, clMax };
#pragma option pop




Próbowałem takiego kodu:

Kod: Zaznacz cały
Archiver->CompressionLevel = ::clMax;


otrzymuje jednak ten sam komunikat.

Kiedyś już miałem podobny problem i znalazłem rozwiązanie, ale nie mogę sobie przypomnieć...

Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 15:36
przez Witold
Kod: Zaznacz cały
Archiver->CompressionLevel = Zipforge::clMax;

Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 15:54
przez kinio
Hej!

Tak, to nie jest trywialny problem.
Tak na szybko:
Cyfrowy Baron napisał(a):Niestety ja potrzebuję tej wartości z klasy TZipForge, tam występuje ona jako typ wyliczeniowy, więc w zasadzie nie mogę użyć jako odpowiednika wartości liczbowej, gdyż jej nie posiada.

Jednak wydaje mi się że można. Przy tak zdefiniowanym typie wyliczeniowym daną wartość symboliczną można zastąpić jej odpowiednikiem liczbowym:
enum TZFCompressionLevel { clNone, clFastest, clNormal, clMax };
clNone = 0
clFastest = 1
clNormal = 2
clMax = 3
czyli myślę że będzie ok jak napiszesz:
Kod: Zaznacz cały
Archiver->CompressionLevel = 3;

To powinno działać, przynajmniej działa na innych kompilatorach.

Pozdrawiam!

Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 16:10
przez Cyfrowy Baron
Do Witold: Tak nie zadziała, gdyż klasa TZipForge nie zawiera przestrzeni nazw o nazwie ZipForge, a Tój zapis właśnie to sugeruje. clMax jest tutaj typem wyliczeniowym.

Do kinio: Masz rację, można zastosować wartość liczbową, wszak typ wyliczeniowy to taka tablica która zamiast liczb zawiera nazwy, ale każdej nazwie odpowiada numer elementu tablicy. Siedzę nad tym już wiele godzin i trochę się pogubiłem. To oczywiście rozwiązuje mój problem, lecz wciąż zastanawiam się, czy istnieje jakieś rozwiązanie, które pozwala użyć nazwy zamiast jej wartości.

Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 16:14
przez Witold
Cyfrowy Baron napisał(a):Do Witold: Tak nie zadziała, gdyż klasa TZipForge nie zawiera przestrzeni nazw o nazwie ZipForge, a Tój zapis właśnie to sugeruje. clMax jest tutaj typem wyliczeniowym.


Sprawdź może jeszcze raz.

ZipForge.hpp:
Kod: Zaznacz cały
// Borland C++ Builder
// Copyright (c) 1995, 2002 by Borland Software Corporation
// All rights reserved

// (DO NOT EDIT: machine generated header) 'ZipForge.pas' rev: 6.00

#ifndef ZipForgeHPP
#define ZipForgeHPP

#pragma delphiheader begin
#pragma option push -w-
#pragma option push -Vx
#include <ZFConst.hpp>   // Pascal unit
#include <ZFUSysUtils.hpp>   // Pascal unit
#include <ZFUClasses.hpp>   // Pascal unit
#include <ZFUWideStrings.hpp>   // Pascal unit
#include <Registry.hpp>   // Pascal unit
//....
#include <System.hpp>   // Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Zipforge  // <--- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
....
}   /* namespace Zipforge */
using namespace Zipforge;
#pragma option pop   // -w-
#pragma option pop   // -Vx

#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif   // ZipForge


Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 16:26
przez kinio
Cyfrowy Baron napisał(a):lecz wciąż zastanawiam się, czy istnieje jakieś rozwiązanie, które pozwala użyć nazwy zamiast jej wartości.

Nie wiem czy da się to zrobić tak bezpośrednio. Gdyby to nie był typ wyliczeniowy tylko np. jakieś pole jakiejś klasy to sprawa jest prosta.
Można próbować to robić na około, ale nie wiem czy jest to sens.
Jak wiesz masz tutaj przestrzeń nazw Graphics i pewnie jest gdzieś linijka:
Kod: Zaznacz cały
using namespace Graphics

bo inaczej nie dałoby się odnosić do Graphics::clMax tak poprostu:
Kod: Zaznacz cały
clMax

tylko trzeba by używać operatora zasięgu:
Kod: Zaznacz cały
Grpahics::clMax

Żeby móc wykorzystać wartość wyliczeniową clMax, obawiam się że trzeba by odwoływać się do niej tam gdzie
Kod: Zaznacz cały
using namespace Graphics

nie obowiązuje. Można by tam zrobić np takie metody:
Kod: Zaznacz cały
TZFCompressionLevel _clMax(void)
{
    return clMax;
}

i później wywołać:
Kod: Zaznacz cały
Archiver->CompressionLevel = _clMax();

Ewentualnie prostą klasę:
w pliku h
Kod: Zaznacz cały
class TZFCmprLev
{
public:
     static TZFCompressionLevel fclMax;
    itp
};

w pliku cpp:
Kod: Zaznacz cały
TZFCmprLev::fclMax = clMax;

i przypisanie:
Kod: Zaznacz cały
Archiver->CompressionLevel = TZFCmprLev::fclMax;

Nic innego mi nie przychodzi do głowy.

Pozdr

Re: Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postNapisane: poniedziałek, 9 marca 2009, 16:29
przez Cyfrowy Baron
Masz rację, nie przeglądałem tego pliku dokładnie, lecz szukałem przestrzeni nazw o ZipForge, a tymczasem ta przestrzeń nosi nazwę Zipforge, czyli małe f.