2011-02-16 4 views
0

다음 코드는 Boost에서 가져 와서 프로젝트에 단순화했습니다. 완전한 코드를 붙여 넣기 위해 제 어필을 받아주세요. 제 질문에 쉽게 대답 할 수 있도록 해드립니다. VS 2008에서 다음 코드를 컴파일하는 동안 followoing 오류가 발생합니다. 내가 addOptions을 기대하고용어가 C++의 함수로 평가되지 않았습니다.

error C2064: term does not evaluate to a function taking 3 arguments 

은 하나가 버그를 발견하시기 바랍니다 수있는 세 가지 인수하지만 안될와 기능 연산자를 호출 OptionsInit 객체를 retruns. 미리 감사드립니다.

namespace MyInfrastructure 
{ 
namespace Internal 
{ 
    class OptionDescrp; 
    class OptionsInit; 
} 

class OptionsCollection 
{ 
public: 

    OptionsCollection(std::string optCollName); 
    Internal::OptionsInit addOptions(); 

private: 

    // avoid copying and assignment. 
    // Prohibit copy 
    OptionsCollection(const OptionsCollection&); 
    OptionsCollection& operator = (const OptionsCollection&); 

    void add(Internal::OptionDescrp* desc) {m_options.push_back(desc);} 

    std::vector<Internal::OptionDescrp* > m_options; 
    std::string m_optCollName; 

    friend class Internal::OptionsInit; 
}; 
} 

//////////// 

#include <string> 
#include <vector> 
#include <assert.h> 
#include "PrgmOptions.h" 


namespace MyInfrastructure 
{ 
namespace Internal 
{ 

class OptionDescrp 
{ 
public: 

    OptionDescrp(std::string pcOptname, std::string description, bool isOptValueReq); 
    virtual ~OptionDescrp(){ }; 

private: 

    std::string m_shortName; // option short name. 
    std::string m_longName; // option long name. 
    std::string m_description;// option description. 
}; 

class OptionsInit 
{ 
public: 
    OptionsInit(OptionsCollection* coll){ owner = coll; } 
    OptionsInit& operator()(std::string name, std::string description, bool isOptValReq); 

private: 
    OptionsCollection* owner; 
}; 

} 

///// 

namespace MyInfrastructure 
{ 
    OptionsCollection::OptionsCollection(std::string optCollName) : m_optCollName(optCollName) {} 

    Internal::OptionsInit OptionsCollection::addOptions() 
    {  
     return Internal::OptionsInit(this); 
    } 
} 

namespace MyInfrastructure 
{ 
namespace Internal 
{ 
    // Class Options description definitions. 
    OptionDescrp::OptionDescrp(std::string pcOptname, std::string description, bool isOptValueReq) 
           : m_description(description) 
    { 
     std::string name(pcOptname); 
     std::string::size_type n = name.find(','); 
     if (n != std::string::npos) 
     { 
      assert(n == name.size()-2); 
      m_longName = name.substr(0, n); 
      m_shortName = '-' + name.substr(n+1,1); 
     } 
     else 
     { 
      m_longName = name; 
     } 
    } 

    // Class Options Init definitions. 
    OptionsInit& OptionsInit::operator()(std::string name, std::string description, bool isOptValReq) 
    { 
     OptionDescrp* opt = new OptionDescrp(name, description, isOptValReq); 
     owner->add(opt); 
     return *this; 
    } 
} 
} 

////// 


int main(void) 
{ 
    MyInfrastructure::OptionsCollection desc("myoptions"); 

    **desc.addOptions()("help", "produce help message", false); // error is thrown here** 

    return 0; 
} 
+1

코드 예제가 불완전합니다. "/////"줄 앞에 닫는 중괄호가 없습니다. 수정 후 #include #include 시작 부분에 코드를 추가하면 MSVC2008 (2009 버전은 존재하지 않음) 및 GCC에서 정상적으로 컴파일됩니다. – zeuxcg

+0

먼저, 오류 메시지가 줄 번호와 함께 제공된 것 같지만 표시된 줄이 표시되지 않습니다. 오류가 발생한 행을 지적하십시오. 또한 VS 2009를 썼습니다. VS 2008을 의미합니까? –

+0

여전히 오류가 발생하고 있습니다. VS2008을 사용하고 있습니다. – venkysmarty

답변

2

예제 코드는 모든 파일을 단일 파일로 복사 할 때 Visual 2008, gcc, Visual 2003에서 오류없이 컴파일됩니다. C2064 오류가 있습니다. #define 또는 다른 정의가 샘플에 포함되지 않은 다른 헤더 어딘가에 있거나, 샘플 코드를 정확히 컴파일하지 않아서입니다. 모든 샘플 코드를 단일 파일에 복사하고 컴파일하십시오.

2

재미있는 코드 : addOptions()을 임시로 돌려 OptionsInit. 그런 다음 비 const 메소드를 호출합니다.이 메소드는 허용되지만 const가 아닌 메소드이기 때문에 허용되지 않는 자체에 대한 비 const 참조를 반환합니다. 하지만 그것은 본질적으로 임시가 아닌 const 참조를 바인딩 "백도어"를 의미합니다 ...

desc.addOptions가 실제로 여기에 연산자 *가 없으므로 나는 두 별표를 가정합니다.

아마도 operator()를 만들고 const-reference를 반환하면 작동 할 것입니다.

+0

안녕하세요, 나는 여전히 동일한 오류에 직면하고 있다고 제안하면서 변경했습니다. 코드에서 두 개의 별표는 오류 라인을 표시하는 것입니다. 더 이상의 제안? 덕분에 – venkysmarty

+0

이 패턴은 부스트에서 사용됩니다. desc.addOptions() ("help", "help help message", false) ("option1", "do option1", true) (​​"option2" "do option2", false) – plodoc

+0

나는 같은 방법으로 사용하려고했지만 컴파일 중이 아닙니다. 3 개의 인수로 작동하지 않는 오류가 발생했습니다. – venkysmarty

0

문제는 VS2008에 있습니다. 나는 VS2010으로 컴파일했고, 잘 컴파일되었다. 입력에 대해 모두 감사드립니다.

+0

vs2008 sp1이 컴파일되고 VS2010과 함께 컴파일됩니다. – venkysmarty

관련 문제