Ambiguity between 'clMax' and 'Graphics::clMax

dział ogólny

Ambiguity between 'clMax' and 'Graphics::clMax

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 marca 2009, 14:08

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ć...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

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

Nowy postprzez Witold » poniedziałek, 9 marca 2009, 15:36

Kod: Zaznacz cały
Archiver->CompressionLevel = Zipforge::clMax;
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

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

Nowy postprzez kinio » poniedziałek, 9 marca 2009, 15:54

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!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 1
    NieznanyNieznana

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

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 marca 2009, 16:10

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

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

Nowy postprzez Witold » poniedziałek, 9 marca 2009, 16:14

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

Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

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

Nowy postprzez kinio » poniedziałek, 9 marca 2009, 16:26

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
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 1
    NieznanyNieznana

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

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 marca 2009, 16:29

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron