2014-04-19 4 views
0

내 프로그램을 컴파일 할 수없는 이유를 알아 내는데 문제가 있습니다.C++ 서브 클래 싱

struct Structure { 
    /** How many points in the space */ 
    idx_t records; 
    /** Number of different kinds of vectors (position, velocity, etc...) */ 
    idx_t vectors; 
    /** Dimensionality of one vector */ 
    idx_t dimensionality; 
}; 

template <class _T> 
class LinearSpace : public Storage<_T> { 
    ... 
    Structure structure; 
public: 
    LinearSpace(int recs, int vecs, int dim) 
    : Storage<_T>(recs*vecs*dim), structure({recs, vecs, dim}) { 
     ... 
    }; 

    LinearSpace(const LinearSpace<_T> &orig, int index = 0) 
    : Storage<_T>(orig, index) { 
     ... 
    } 
}; 

모든이 시점까지 괜찮 : 나는 내가 LinearSpace 클래스를 파생 할이 기본 클래스에서

template <class _T> 
class Storage { 
    ... 
    Storage<_T> &provider; 
public: 
    Storage(int n) 
    : provider(self) { 
     ... 
    }; 

    Storage(const Storage<_T> &orig, int offset = 0, int size = 0) 
    : provider(orig.provider) { 
     ... 
    } 
}; 

처럼 보이는 Storage 템플릿 클래스가 있습니다. 내가 정의한 모든 생성자를 사용하여 StorageLinearSpace 개체를 쉽게 생성 할 수 있습니다. 그러나, 나는

template <class _T> 
class Record : public LinearSpace<_T> { 
    ... 
public: 
    Record(int vecs, int dim) 
    : LinearSpace<_T>(1, vecs, dim) { 
     ... 
    }; 

    Record(const LinearSpace<_T> &orig, int index = 0) 
    : LinearSpace<_T>(orig, index) { 
     ... 
    } 
}; 

을 다음과 같이 LinearSpace을 하위 클래스 시도하고 LinearSpace에서 Record과 (LinearSpace의 두 번째 생성자를 호출 Record의 두 번째 생성자) 인덱스 I 컴파일러에서 오류를 구성하려고 이는 no matching constructor for initialisation of LinearSpace<type>이 있다고 불평합니다.

LinearSpace<TYPE> space(2, 2, 2); 
Record<TYPE> record(space, 0); 

가 나는 그것을 얻지 않는다 ... Record의 생성자는 정기적으로 LinearSpace의 생성자를 호출하고 LinearSpace 객체와 정수에 대한 참조를 제공합니다 : 나는 다음과 같은 시도 할 때 오류가 상승한다. 이러한 생성자는 분명히 존재하므로 쓰기가 가능합니다.

LinearSpace<TYPE> space2(space, 0); 

아무런 문제가 없습니다. 그래서, 왜 내 프로그램을 컴파일 할 수 없는지 모르겠다!

오랫동안 죄송합니다. 누구나 내가 잘못 알고 있다는 생각을 갖고 있습니까?

미리 감사드립니다.

P. X86 (최신 버전의 LLVM 5.1 사용)이 OS X 10.9에서 실행되고 있습니다.

+1

* 특정 * 오류를 게시 할 수 있습니까? ctor의'const'ness를 제거해 보았습니다. const가 아닌 객체를 전달하는 것과 아무 관계가 없는지 확인해 주시겠습니까? – MrDuk

+1

'_T'는 구현에 예약 된 이름이기 때문에 공식적으로 코드는 유효하지 않습니다. 밑줄로 시작하고 대문자로 시작하는 모든 이름은 예약되어 있습니다. 이름에도 두 개의 연속적인 밑줄이 있습니다. 또한, 밑줄로 시작하는 모든 이름은 전역 이름 공간에 예약되어 있습니다. –

+0

오류를 나타내는 짧은 ** ** ** 프로그램을 게시하십시오. 오류에 영향을주지 않는 모든 행을 삭제하고 남겨진 내용을 복사하여 붙여 넣으십시오. 자세한 내용은 http://stackoverflow.com/help/mcve 또는 http://SSCCE.org를 참조하십시오. –

답변

-1

다음 코드는 Visual C++ 12.0 및 4.8.2로 컴파일됩니다.

Smalltalk (?) self이 C++ *this으로 대체되었다는 점을 제외하고는 코드와 동일합니다.

template <class _T> 
class Storage { 
    //... 
    Storage<_T> &provider; 
public: 
    Storage(int n) 
    : provider(*this) {  //! "self" -> "*this" 
     //... 
    }; 

    Storage(const Storage<_T> &orig, int offset = 0, int size = 0) 
    : provider(orig.provider) { 
     //... 
    } 
}; 

using idx_t = int; 

struct Structure { 
    /** How many points in the space */ 
    idx_t records; 
    /** Number of different kinds of vectors (position, velocity, etc...) */ 
    idx_t vectors; 
    /** Dimensionality of one vector */ 
    idx_t dimensionality; 
}; 

template <class _T> 
class LinearSpace : public Storage<_T> { 
    //... 
    Structure structure; 
public: 
    LinearSpace(int recs, int vecs, int dim) 
    : Storage<_T>(recs*vecs*dim), structure({recs, vecs, dim}) { 
     //... 
    }; 

    LinearSpace(const LinearSpace<_T> &orig, int index = 0) 
    : Storage<_T>(orig, index) { 
     //... 
    } 
}; 

template <class _T> 
class Record : public LinearSpace<_T> { 
    //... 
public: 
    Record(int vecs, int dim) 
    : LinearSpace<_T>(1, vecs, dim) { 
     //... 
    }; 

    Record(const LinearSpace<_T> &orig, int index = 0) 
    : LinearSpace<_T>(orig, index) { 
     //... 
    } 
}; 

int main() 
{ 
    using TYPE = double; 
    LinearSpace<TYPE> space(2, 2, 2); 
    Record<TYPE> record(space, 0); 
} 

코드가 2 개의 최신 컴파일러로 컴파일되면 컴파일러에 문제가있는 것처럼 보입니다.


“How do I post a question about code that doesn't work correctly?”라는 제목의 C++ FAQ 항목을 읽어 마십시오, 특히 5, 6, 7

+0

Objective-C를 사용하면서 키워드를 좋아해서 실제로'#define self * this'를 가지고 있습니다. 나는 또한'idx_t = int'와'TYPE = double'을위한 typedef를 가지고 있습니다. 그래서 제 코드는 당신 코드와 동일합니다. 나는 컴파일러에서 몇 가지 문제를 겪고 있다고 말하고 싶다. 아니면 다른 방법으로 이것을 망쳐 놓고있다. 나는 이제 GCC를 시도해보고 알려준다. 고마워! – gianluca

+0

@anonymous downvoter : 당신의 downvote를 설명하십시오. –

0

해결 포인트!

어떤 이유로 (@ Murduk 제안) const 지정자 (Record 생성자)가 문제의 원인입니다. 그것을 제거하면 애플의 LLVM 5.1과 아무런 차이가 없겠지만 방금 테스트 한 GNU GCC 4.9를 사용할 때이 문제가 해결되었습니다.

도움 주셔서 감사합니다.