g++ 문법은 표준 C++지원이 미약 한가요?

onemind555의 이미지

class Base{
..
}

class Deriven{
...
}

class In {..}

Deriven d;
Base &b = d;

dynamic_cast<Deriven &>(b);

이런 문법의 사용이 안 되는데 해결 방법 있는가요.. Deriven을 struct로 인식 하면서 컴파일 에러가 나옵니다.

그리고 안되는것 또한가지..

Deriven클래스 생성 자라고 가정 att는 Deriven멤버 변수
Deriven () : att(new In()) {

}

저런식으로 초기화 내부에 클래스 사용도 안 되는 것 같은데 방법 없나요??
gcc버젼은 레드헷 리눅스 9.0에 깔려 있는 것입니다.

onemind555의 이미지

...트릭 같은 것이라도 없을 까요..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

icanfly의 이미지

dynamic_cast<>() 는 가상함수를 포함하지 않는 자료형에는

사용할 수 없다고, 알고만있는데.....

Base와 Deriven 의 상속관계에서 가상함수가 포함되어 있는지요?

확인하시고, 결과를 말씀해 주시면 감사하겠습니다.

onemind555의 이미지

그부분이 아니고 다른 곳에서 문제가 일어 나더군요..

인라인으로 된 함수들은 cpp로 다 옮기고 #include도 cpp로 옮기니 되더군요..

VC에서 돌아 가던 소스 였는데..
GCC는 의존성 문제부분에서 약한 면을 가진듯 하네요..
그리고 에러 처리부분도 약하고 에러난 부분에서 에러를 안 일으키고 엉뚱한 곳에서 일으키는 것을 보니...

그리고 또 알아 낸것은 ...
GCC에서 잘 안 되는것 하나가 함수 인자 넣는 부분에서 객체를 자동 생성 하는 것이 가끔 안 되는 것이 있더군요.. 그래서 앞에 임시 변수를 하나 두어 해결 했습니다.
가령 이런거 말이죠..
Func(myClass() );
이런게 잘 안 되더군요.

myClass aaa;
Func(aaa);
이런식으로 하면 잘 되더군요..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

mykldp의 이미지

저는 그런적이 없었는데...혹시 Func 가 const myClass 를 받지 못했던것 아닐까요..? Func(const myClass&) 로 선언되어야 Func(myClass()) 로 사용할 수 있을테니까요. 그런 기본적인 것이 컴파일 되지 않을 까닭이 없습니다.
------------------
함수 선언에서 & 기호를 빼먹었었습니다...-_-; 수정합니다.

onemind555의 이미지

함수는
void Fun(Base &);

함수 호출을
Fun(Deriven()); 이런식으로 하니 에러가 나는 듯 하군요.

정확한 재연은 찾기 귀찮아 생략 합니다. 이해 바랍니다..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

verena의 이미지

onemind555 wrote:
그부분이 아니고 다른 곳에서 문제가 일어 나더군요..

인라인으로 된 함수들은 cpp로 다 옮기고 #include도 cpp로 옮기니 되더군요..

VC에서 돌아 가던 소스 였는데..
GCC는 의존성 문제부분에서 약한 면을 가진듯 하네요..
그리고 에러 처리부분도 약하고 에러난 부분에서 에러를 안 일으키고 엉뚱한 곳에서 일으키는 것을 보니...

그리고 또 알아 낸것은 ...
GCC에서 잘 안 되는것 하나가 함수 인자 넣는 부분에서 객체를 자동 생성 하는 것이 가끔 안 되는 것이 있더군요.. 그래서 앞에 임시 변수를 하나 두어 해결 했습니다.
가령 이런거 말이죠..
Func(myClass() );
이런게 잘 안 되더군요.

myClass aaa;
Func(aaa);
이런식으로 하면 잘 되더군요..

만일 인라인 문제라면 컴파일러 옵션의 디폴트가 inline을 못쓰게 해서 일겁니다. 저도 g++을 사용할때 겪은 문제인데 inline키워드를 쓰게하는 옵션을 셋팅하고 컴파일을 해보시기 바랍니다...

exsider의 이미지

Quote:
함수는
void Fun(Base &);

함수 호출을
Fun(Deriven()); 이런식으로 하니 에러가 나는 듯 하군요.

정확한 재연은 찾기 귀찮아 생략 합니다. 이해 바랍니다..

위에서 다른 분이 말씀하셨는데
Fun(Deriven());

로 호출하려면 함수선언이
void Fun(const Base &); 나
void Fun(Base );

로 되어있어야 합니다.(밑의 것은 정상적으로 작동하지 않을 확률이 높음)
에러가 나는게 당연한 것이고 vc++ 에서 컴파일이 된다면(경고도 한마디 없다면) vc++ 쪽이 잘못된 것입니다.

onemind555의 이미지

Deriven deriven;
Func(deriven) ;

이나

Func(Deriven());

이것과 별로 차이점이 없는 걸로 아는데... 차이점은 변수의 생존 기간 이겠지만... 경고 날릴 필요도 없고 문제가 없는 코드 아닌가요..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

exsider의 이미지

void Fun(Base &);

이렇게 선언을 하고

Fun(Deriven());

이렇게 호출하면 임시로 Deriven 객체가 만들어져서 매개변수로 넘어갑니다.
그런데 함수가 참조를 받기 때문에 이 임시객체를 수정할 수가 있습니다.
그런데 임시객체를 수정하는 것은 아무 의미가 없습니다.(수정해봤자 함수가
끝나고 나면 없어지므로 소용이 없죠. 수정해서 리턴하면 되지 않느냐고 하실지
모르겠는데 그런경우는 참조가 아니라 값으로 받게 하는게 났습니다.)
그래서 컴파일러에서 이렇게 코딩하면 에러로 간주하고(아마 프로그래머가
실수한 거라고 판단한 거겠죠.) 컴파일을 중단하는 것입니다.

하지만 상수 참조를 넘길 경우에는 아무 문제가 없습니다. 받은 참조를 수정하지
않기 때문에 임시객체를 넘겨도 문제가 없는 것이죠.

onemind555의 이미지

미처 생각 못했던 부분이군요..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.