2013-06-20 1 views
3

멤버 변수 유형이 아닌 완전한 유형으로 만 사용할 수있는 유형을 만들고 싶습니다.struct/class에서 멤버 변수 유형으로 형식이 사용되지 않도록하려면 어떻게해야합니까?

는 그래서는 T 유형에 허용된다 :

T a; 
^^^ 
int foo(T b); 
     ^^^ 
struct C { int foo(T b); }; 
        ^^^ 
int main() { T c; } 
      ^^^ 

하지만이 시간 오류 컴파일의 원인이된다 : 내가 지금까지 시도 아무것도 제시 아주 많이 싶습니다

struct C { T a; }; 
      ^^^ 

을하지만, 적어도 내가 필요한 해결책에 가까울 수있는 것은 없습니다. 미안합니다.

물론 C++에서는 가능하지 않다는 것을 증명하는 답변도받습니다.

왜이 기능이 필요한가요? 다른 개체의 요소가 될 수없는 smart pointer을 갖고 싶습니다. 순환 종속성을 막는 나쁜 방법 ...

답변

2

수 없습니다.

function-definition:
decl-specifier-seqoptdeclarator ctor-initializeropt function-body
decl-specifier-seqoptdeclarator function-try-block

그것이, 클래스 :

class-specifier:
class-head { member-specificationopt }

member-specification:
member-declaration member-specificationopt
access-specifier : member-specificationopt

member-declaration:
decl-specifier-seqopt member-declarator-listopt ;
function-definition ;opt
::opt nested-name-specifier templateopt unqualified-id ;
using-declaration
template-declaration
member-declarator-list:
member-declarator
member-declarator-list , member-declarator

member-declarator:
declarator pure-specifieropt
declarator constant-initializeropt
identifieropt : constant-expression

마지막 declarator는 C++ 문법에서 함수에 대한 선언이다 (강조 광산, 관련 부분은 명확성을 위해 생략되지이다) :

declarator:
direct-declarator
ptr-operator declarator

direct-declarator:
declarator-id
direct-declarator (parameter-declaration-clause) cv-qualifier-seqopt
exception-specificationopt
direct-declarator [ constant-expressionopt ]
(declarator)

당신이 캘리포니아로 함수의 인수에 사용할 수있는 유형이 클래스 구성원으로도 사용될 수 있습니다.

+0

+! 당신의 노력에. 그러나 나는 이것이 어쨌든 나를 도왔다는 것을 의심한다. – PiotrNycz

+0

@PiotrNycz LOL 이것은 함수의 매개 변수로 사용될 수있는 것이 ** (수정 자 외에) 항상 클래스 멤버로 사용될 수 있다는 것을 문법적 관점에서 의미합니다. 즉, 매개 변수 중 하나를 클래스 멤버로 저장하는 메서드를 방지 할 수 없습니다. ** 할당 연산자 **를 재정의하더라도 포인터, 별칭 및 캐스팅을 사용하는 모든 유형 검사를 무시할 수 있습니다. 객체 생성 방법을 제어 할 수 있습니다 (예를 들어 팩토리 메소드를 사용하여). 그러나 모든 것이 가능합니다. ** 객체가 순환 참조를 그 객체에 저장하는 것을 막을 수는 없습니다 **. –

+0

포인터에 대한 좋은 지적, 감사합니다. – PiotrNycz

2

클래스 외부의 개체를 사용할 수있는 경우 클래스의 멤버가 될 수 있습니다. 나는 당신이 그것을 어떤 식 으로든 막을 수 없다는 것을 99.9 % 확신한다. (다른 방법으로 어떻게/어디에서 사용할 수 있는가를 제한하지 않는다. 분명히 private 생성자를 가짐으로써 클래스의 직접 멤버가되는 것을 막을 수있다. 그러나 그것은 또한 당신이 보여주고있는 다른 세 가지 시나리오에서 사용되는 것을 제한 할 것입니다.)

+0

+! 개인 생성자에 대한 아이디어. 나는이 개념을 따르려고 노력할 것이다. – PiotrNycz