2012-04-04 5 views
2

오늘 저는 C++ 애플리케이션을 리빌드하고 컴파일이 실패했습니다. 아무것도 변경되지 않았습니다. 첫 번째 오류는 여기 std::vector (개인 상속)에서 상속 내 수업 List에 있었다 :부스트 라이브러리 (program_options)에서 컴파일이 실패합니다.

template<typename T> void List<T>::append(const T& value) 
{ 
    push_back(value); 
} 

내가 어떤 선언은 컴파일러에 의해 발견되지 않았기 때문에 push_back(value); 전에 std::vector<T>::를 추가했다. 나는 왜 그런 일이 일어날 지 모르지만, g ++의 업데이트가 있었는데, 이제 아치 리눅스에서 C++ 11을 사용하여 g ++ v4.7.0 (시험판)을 사용합니다.

문제가 해결되었지만 실제 문제는 부스트 라이브러리 program_options의 문제로 인해 나머지 응용 프로그램을 컴파일 할 수 없다는 것입니다.

#include <boost/config.hpp> 
#include <boost/program_options/detail/config_file.hpp> 
#include <boost/program_options/parsers.hpp> 

오류 : 내가 가진 라이브러리를 포함

내 List 클래스보다
g++ -m64 -pipe -pedantic -Wextra -std=gnu++0x -c -g -Wall -DDEBUG -DDEV -DMYSQL_SUPPORT -I. -IHeaders -MMD -MP -MF build/Debug/GNU-Linux-x86/Sources/Libs/Settings.o.d -o build/Debug/GNU-Linux-x86/Sources/Libs/Settings.o Sources/Libs/Settings.cpp 
/usr/include/boost/program_options/detail/config_file.hpp: In instantiation of ‘bool boost::program_options::detail::basic_config_file_iterator<charT>::getline(std::string&) [with charT = char; std::string = std::basic_string<char>]’: 
In file included from Sources/Libs/Settings.cpp:33:0: 
Sources/Libs/Settings.cpp:69:24: required from here 
/usr/include/boost/program_options/detail/config_file.hpp:163:13: erreur: ‘to_internal’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive] 
In file included from /usr/include/boost/program_options/detail/parsers.hpp:9:0, 
       from /usr/include/boost/program_options/parsers.hpp:265, 
       from Sources/Libs/Settings.cpp:34: 
/usr/include/boost/program_options/detail/convert.hpp:75:34: note: ‘template<class T> std::vector<std::basic_string<char> > boost::program_options::to_internal(const std::vector<T>&)’ declared here, later in the translation unit 

같은 오류 ...

감사합니다!

답변

3

gcc 4.7의 템플릿 인스턴스화에 대한 2 단계 조회 규칙의 변경 사항에 물린 것으로 의심됩니다.

소스 코드가 없으면 더 이상 조언 할 수 없지만 gcc4.7 changes (장 C++)에서는 2 단계 조회에 대한 설명을 제공하고 일부 코드 수정을 제안합니다.

0
template<typename T> void List<T>::append(const T& value) 
{ 
    this->push_back(value); 
}