boost::lexical_cast gibt fehler unter Qt und nicht in VS2010

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Strumpa
Beiträge: 5
Registriert: 23. Juni 2012 21:45

boost::lexical_cast gibt fehler unter Qt und nicht in VS2010

Beitrag von Strumpa »

Hallo,

ich bin gerade dabei den Code einer Consolenanwendung die ich in VS2010exp geschrieben habe in den Qt Creator rüberzuschaufeln um dort eine widget basierte Anwendung zu erstellen. Im code verwende ich oft boost::lexical_cast. Unter VS läuft das ohne Probleme. In Qt (ich verwende den VS compiler) erhalte ich folgende Fehlermeldung (ohne bezug auf eine besondere Zeile im code):

c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1116: error: C2535: 'bool boost::detail::lexical_stream_limited_src<CharT,Base,Traits>::operator >>(unsigned short &)' : member function already defined or declared
with
[
CharT=char_type,
Base=base,
Traits=traits
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:993: see declaration of 'boost::detail::lexical_stream_limited_src<CharT,Base,Traits>::operator >>'
with
[
CharT=char_type,
Base=base,
Traits=traits
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1524: see reference to class template instantiation 'boost::detail::lexical_stream_limited_src<CharT,Base,Traits>' being compiled
with
[
CharT=char_type,
Base=base,
Traits=traits
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1653: see reference to function template instantiation 'Target boost::detail::lexical_cast<Target,src,false,char_type>(const std::basic_string<_Elem,_Traits,_Ax> &,CharT *,size_t)' being compiled
with
[
Target=float,
_Elem=wchar_t,
_Traits=std::char_traits<wchar_t>,
_Ax=std::allocator<wchar_t>,
CharT=char_type
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1641: while compiling class template member function 'float boost::detail::lexical_cast_do_cast<Target,Source>::lexical_cast_impl(const Source &)'
with
[
Target=float,
Source=src
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1813: see reference to class template instantiation 'boost::detail::lexical_cast_do_cast<Target,Source>' being compiled
with
[
Target=float,
Source=src
]
c:\Program\boost\boost_1_47\boost\lexical_cast.hpp:1813: see reference to class template instantiation 'boost::detail::lexical_cast_do_cast<Target,Source>' being compiled
with
[
Target=float,
Source=src
]

Wo liegt hier der Hund begraben?
Grüße
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von franzf »

Irgendwo include guards vergessen?
Strumpa
Beiträge: 5
Registriert: 23. Juni 2012 21:45

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von Strumpa »

Include guard ist mir was neues. (Bin seit gestern mit Qt zugange)
In der .pro habe ich den hauptpfad zu boost hinterlegt:

INCLUDEPATH += C:\\Program\\boost\\boost_1_47

und in der besagten .cpp

#include <boost\algorithm\string.hpp>
#include <boost\foreach.hpp>
#include <boost\lexical_cast.hpp>

Sonst keine includes. Ich kann somit keinen "Zirkelverweis" erkennen. Aber ich forsche mal weiter in die Richtung..
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von franzf »

Kannst du mal ein minimales Beispiel zusammenstellen, das beim Kompilieren mit dem selben Fehler aussteigt? Denn ohne Code kann man schwer helfen ;)
Strumpa
Beiträge: 5
Registriert: 23. Juni 2012 21:45

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von Strumpa »

Ich habe noch kein min Beispiel zusammengedampft aber im Prinzip wird folgendes gemacht:

Code: Alles auswählen

#include "TABLE.h"
std::vector<std::wstring> tokenized;
// Dann wird tokenized mit Inhalt gefüllt..
itPlayName->preGame.points = boost::lexical_cast<float>(tokenized[tokenized.size()-1]);
table.h fängt so an:

Code: Alles auswählen

#ifndef TABLE_H
#define TABLE_H

#include "stdafx.h"
#include <map>
#include "stdlib.h"
#include <boost\algorithm\string.hpp>
#include <boost\foreach.hpp>
#include <boost\lexical_cast.hpp>
#include "PLAYER.h"
player.h

Code: Alles auswählen

#ifndef PLAYER_H
#define PLAYER_H

#include "windows.h"
#include <vector>
#include <algorithm>
und stdfx.h

Code: Alles auswählen

#pragma once

//#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include "windows.h"
#include "string.h"
#include "conio.h"
#include "WinNT.h"
#include "stdlib.h"
#include "time.h"
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
und die .pro Datei:

Code: Alles auswählen

QT       += core gui

TARGET = untitled
TEMPLATE = app


SOURCES += main.cpp\
        textfinder.cpp \
    PLAYER.cpp \
    TABLE.cpp

HEADERS  += textfinder.h \
    stdafx.h \
    PLAYER.h \
    TABLE.h

FORMS    += textfinder.ui

RESOURCES += \
    textfinder.qrc

INCLUDEPATH += C:\\Program\\boost\\boost_1_47
Es sind noch ein paar überflüssige includes dabei, aber keiner sollte dem BOOST teil in dei quere kommen...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von franzf »

Ich hab mir jetzt extra selber ein Beispiel mit Qt und boost::lexical_cast zusammen gebastelt, und wie zu erwarten - kompiliert.

Code: Alles auswählen

#include <QtCore/QString>
#include <QtCore/QDebug>

#include <string>
#include <boost/lexical_cast.hpp>
#include <iostream>

int main() {
    std::wstring s = L"123.5";
    float f = boost::lexical_cast<float>(s);
    std::wcout << f << std::endl;
    QString qs = QString::number(f);
    qDebug() << qs;
}
Ich verwende aber auch gcc-4.6.3 unter Linux (+ Qt-4.8.2, boost-1.49.0). Also womöglich ein VS-Problem.
Pack doch einfach mal alles in ein .zip und häng es hier an. (Forenfunktion "Dateianhang hochladen")

Was mir noch auffällt: du verwendest die veralteten C-Header. Statt time.h solltest du ctime nehmen, statt string.h cstring, usw. Außerdem sind das Header deiner Installation und nicht projektlokale, die über einen relativen Pfad erreichbar sind, dann packt man die in "<>".
Außerdem kommen in HEADERS im .pro nur solche Header, die durch den moc sollen, also wo Klassen von QObject abgeleitet definiert und mit Q_OBJECT versehen sind - stdafx.h ist das schonmal nicht ;)
Strumpa
Beiträge: 5
Registriert: 23. Juni 2012 21:45

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von Strumpa »

Hallo Franz, vielen Dank für Deine Antwort und Zeit....
Das die header veraltet waren wusste ich nicht... habe ich schon mal geändert.
<> bzw "" --> Hast recht ;-)
Was bedeutet "moc"? Da ich erst seit 2 Tagen mit Qt arbeite möge man mir mein Unwissen verzeihen.

Grüße,
Strumpa
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von franzf »

Nachdem ich das ganze Windows-Zeugs rausgehauen hab, hat es kompiliert.
Also entweder ein VS-Problem oder du hast an den boost-headern rumgeschraubt. Probiers mal mit einer frischen (am besten aktuellen) Version.
In einem Beitrag im Internet hab ich gelesen, dass lange Kommentare den VS verwirren können. Verpass deinen Sourcen mal ne Schrumpfkur und lösche ALLE Kommentare!
Strumpa
Beiträge: 5
Registriert: 23. Juni 2012 21:45

Re: boost::lexical_cast gibt fehler unter Qt und nicht in VS

Beitrag von Strumpa »

Moin! Habe die neuste Boost version runtergeladen, nun läufts. Hattest Du bei deinem Versuch eine Fehlermeldung bezüglich "TABLE.obj : error LNK2019: unresolved external symbol __imp__GetWindowTextW@12 referenced in...." ? Grüße Strumpa
Antworten