2010-06-12 7 views
2

나는 다음과 같은 이름 충돌 당황하고에서 이름 충돌 :C++, 다른 네임 스페이스

namespace mp2 { 

boost::numeric::ublas::matrix_range<M> 
slice(M& m, const R1& r1, const R2& r2) { 
    namespace ublas = boost::numeric::ublas; 
    ublas::range r1_(r1.begin(), r1.end()), r2_(r2.begin(), r2.end()); 
    return ublas::matrix_range<M>(m, r1_, r2_); 
} 

double energy(const Wavefunction &wf) { 
    const Wavefunction::matrix& C = wf.coefficients(); 
    int No = wf.occupied().size(); 

    foreach (const Basis::MappedShell& P, basis.shells()) { 
     slice(C, range(No), range(P)); 

그램에서 오류가 ++ 4.4

7 In file included from mp2.cpp:1: 
8 /usr/include/boost/numeric/ublas/fwd.hpp: In function âdouble mp2::energy(const Wavefunction&)â: 
9 /usr/include/boost/numeric/ublas/fwd.hpp:32: error: âboost::numeric::ublas::sliceâ is not a function, 
10 ../../src/mp2/energy.hpp:98: error: conflict with âtemplate<class M, class R1, class R2> boost::numeric::ublas::matrix_range<M> mp2::slice(M&, const R1&, const R2&)â 
11 ../../src/mp2/energy.hpp:123: error: in call to âsliceâ 
12 /usr/include/boost/numeric/ublas/fwd.hpp:32: error: âboost::numeric::ublas::sliceâ is not a function, 
13 ../../src/mp2/energy.hpp:98: error: conflict with âtemplate<class M, class R1, class R2> boost::numeric::ublas::matrix_range<M> mp2::slice(M&, const R1&, const R2&)â 
14 ../../src/mp2/energy.hpp:129: error: in call to âsliceâ 
15 make: *** [mp2.lo] Error 1 

ublas 세그먼트는이

namespace boost { namespace numeric { namespace ublas { 
    typedef basic_slice<> slice; 
입니다

ublas의 슬라이스가 mp2의 slice와 충돌하는 이유는 무엇입니까? 나는 코드와 포함에 using namespace ublas이 없음을 확신합니다.

+0

죄송합니다. 불필요한 컴파일러 메시지가 삭제되었습니다. – Anycorn

+0

어디서나 사용하는 문장이 있습니까? –

+0

@Dav 아니오, 찾지 못했습니다. 나는 ublas를 통해 본다, 그들은 괜찮은 것처럼 보였다. – Anycorn

답변

2

내가 진행 argument-dependent lookup 있다고 생각 감사합니다.

slice(C, range(No), range(P)); 

range 인수는 겉으로는 (아마도 using boost::numeric::ublas::range;와 수입) boost::numeric::ublas에서, 그래서 컴파일러는 이름이 거기에 slice 유형이 포함이 네임 스페이스를 형성 간주합니다.