14

boost :: variant를 사용 중이며 릴리스 모드에서 컴파일하는 데 문제가 있습니다. 경고 수준 4 및 경고를 VC2010에서 오류로 처리하고 있습니다. 아래의 코드는 디버그 모드에서 정상적으로 컴파일되지만 릴리스 모드에서는 링크 시간에 "Unreachable code"C4702 경고가 발생합니다 (최적화가 활성화되면 링크 타임 코드 생성이 있기 때문에 컴파일러 경고가 표시됩니다).이 C4702 링크 타임 경고에 대한 해결 방법이 있습니까?

아무도이 상황에서 이러한 경고를 사용하지 못하도록 설정 했습니까? 가능한 경우 높은 경고 수준과 경고를 오류로 유지하는 것이 좋습니다.

#pragma warning(disable:4702) 

... 여기서는 효과가없는 것 같습니다. 여기에 몇 가지 예제 코드는 다음과 같습니다

#include <boost/variant.hpp> 

struct null{}; 
typedef boost::variant< null, double > variant_t; 

class addition_visitor 
: public boost::static_visitor<variant_t> 
{ 
public: 
    template< typename T, typename U > 
    variant_t operator()(const T&, const U&) const 
    { 
     throw("Bad types"); 
    } 

    variant_t operator()(const double& left, const double& right) const 
    { 
     return variant_t(left * right); 
    } 
}; 

int main(int /*argc*/, char** /*argv*/) 
{ 
    variant_t a(3.0), b(2.0); 
    variant_t c = boost::apply_visitor(addition_visitor(), a, b); 
    return 0; 
} 

경고는 내가 나쁜 변형 유형에 방문자를 적용하는 시도를 잡기 위해 사용하고 템플릿 기반 연산자()에 의해 트리거됩니다.

+5

엄지 손가락 오류로 경고 경고 수준 4 +에! –

+0

당신은 포함하기 전에 파일의 상단에있는 프라그를 넣어 시도? 그리고 @Matthieu는 절대적으로 버그가 나타나기 전에이를 없앱니다. – ssube

+1

클래스 정의 주변의 apply_visitor 호출과 stdafx.h의 맨 위에있는 파일 상단에 pragma를 넣으려고 시도했습니다. 불행히도. – RobH

답변

1

점심과 산책을 한 후, 불만족 스럽지만 기능적으로 해결되었습니다. 대신 내 방문자에서 변형을 반환하고 오류에 던지고, 나는 때문에, 성공은 부울 반환하고 결과를 저장 :

#include <boost/variant.hpp> 

struct null{}; 
typedef boost::variant< null, double > variant_t; 

class addition_visitor 
: public boost::static_visitor<bool> 
{ 
public: 
    template< typename T, typename U > 
    bool operator()(const T&, const U&) 
    { 
     //throw("Bad types"); 
     return false; 
    } 

    bool operator()(const double& left, const double& right) 
    { 
     result = variant_t(left * right); 
     return true; 
    } 

    variant_t result; 
}; 

int main(int /*argc*/, char** /*argv*/) 
{ 
    variant_t a(3.0), b(2.0); 
    addition_visitor v; 
    if(!boost::apply_visitor(v, a, b)) 
    { 
     throw("Bad types"); 
    } 

    variant_t c = v.result; 
    return 0; 
} 
1

왜 모든 템플릿 운영자 몸을 제공?

부스트를 사용할 수 없으므로 여기서는 확인해 볼 수 없지만 템플릿이있는 연산자에는 유형이 무엇이든 관계없이 모든 호출이 제대로 컴파일되고 그 다음에 던져 질 것입니다. 런타임시 오류.

템플릿 연산자의 본문을 그대로두면 두 개 이상의 다른 유형과 함께 사용할 때 단순히 연결을 거부합니다.

+0

문제는 런타임에 변형의 유형이 결정된다는 것입니다. 이 경우 변형은 실제로 시장 데이터 스트림에서 값을 보유하며 값 (따라서 해당 유형)의 선택은 구성 가능합니다. 이 방문자 클래스는 예를 들어 null과 double을 포함하는 변형에 적용될 수 있으며이를 트래핑해야합니다. 컴파일러는 변형 템플릿 인수 목록에있는 각 쌍의 쌍에 유효한 operator()가 있어야합니다. non-double 메서드를 선언했지만 구현을 제공하지 않으면 "해결되지 않은 외부"링커 오류가 발생합니다. – RobH

1

컴파일 타임 경고가 아니기 때문에 #pragma가 작동하지 않습니다.

해제 모드에서 경고를 억제 할 수 있습니다. 내가 믿는/무시 : xxxx 링커 명령 줄에서 트릭을 할 것입니다.

+1

불행히도 링커 오류를 무시하는 옵션은 VC2010에서 제거되었습니다. 또한 이것은 실제로 링크 타임 코드 생성에 의해 생성 된 (컴파일러 경고) 컴파일러 경고입니다. – RobH

0

내가 비를 두 번 방법을 선언하고 구현을 제공하지 않으면 그때는 "확인되지 않은 외부"링커 오류가 .

템플릿 연산자 정의에 inline 지정자를 추가하십시오. 그런 다음 MSVC는 자체적으로 클래스 자체를 컴파일 할 필요가 없습니다. 따라서 unresolved external 대신 코드가이 템플릿을 사용하려고 할 때만 컴파일 타임 오류가 발생합니다. 내가 알기로 - 이것은 당신이 원하는 것입니다.

+0

간단한 예제 코드로 약간 잘못 이해했을 수도 있습니다. 실제로, 컴파일 타임에 내 변형의 유형을 알지 못합니다. 여기에는 라이브 피드의 가격이 포함되며 이중 일부는 null 일 수 있습니다. 형식 검사는 런타임에 수행되므로 컴파일 타임에 포함 된 유형의 가능한 모든 조합에 대해 방문자 메서드를 구현해야합니다 (boost :: variant 구현과 컴파일러 필요). – RobH

0

템플릿을 operator()(...)으로 설정하고 구현을 제공하지 않습니다. 그것은 링크 타임 대신에 컴파일 타임에 그것의 사용을 잡을 것이다.

+0

변형 유형 검사는 런타임에 수행됩니다 (내 의견을보고 다른 곳에서 답하십시오). 따라서 구현을 제공하지 않으면 작동하지 않습니다. – RobH

1

Visual Studio 2012 MFC 프로젝트에서 매우 비슷한 문제가 발생했습니다. 동일한 경고가 > 헤더 파일에서 발생했으며 릴리스 링크 타임 코드 생성 중에도 발생했습니다.
미리 컴파일 된 헤더 파일 ("stdafx.)에 #pragma warning (disable : 4702)을 추가하여 해결했습니다.내 경우에는 시간 ", 단지 전) STL 헤더 파일을 #include 한.

관련 문제