2012-02-19 1 views
-1

Ubuntu 11.04의 Netbeans 7.1에서 C++을 개발 중입니다. 왜 누군가가 Stack fs (5)를 말할 수 있는지 궁금 해서요. Stack :: Stack (int)에 대한 정의되지 않은 참조로 간주됩니다. T에 사용 된 부유물을 가진 클래스로 보이지 않는 이유는 무엇입니까?우분투의 Netbeans; C++; 정의 된 템플릿 "undefined"

#include <iostream> 

using namespace std ; 

template <class T> 
class Stack 
{ 
public: 
    Stack(int = 10) ; 
    ~Stack() { delete [] stackPtr ; } 
    int method1(const T&); 
    int method2(T&) ; 
    int method3()const { return top == -1 ; } 
    int method4() const { return top == size - 1 ; } 
private: 
    int attribute1 ; 
    int attribute2 ; 
    T* stackPtr ; 
} ; 


using namespace std; 
int main() 
{ 
    // This line gives the error message "undefined reference to `Stack<float>::Stack(int)'" 
    Stack<float> fs(5); 

    return 0; 
} 

감사합니다. 피터.

+1

사라 int입니다 그리고 당신이 정말로 말을 않았다 'namespace std;를 사용하는 것 ** ** 두 번 **, 당신이 끔찍하고 끔찍한 말을하는 것을 신경 쓰지 않는다는 것을 보여주기 위해서? –

+1

@KerrekSB,'네임 스페이스 표준 사용하기 ' 라이브러리 헤더 안에 (따라서 다른 사람들에게도 강제로) 사용하면 문제가되지 않습니다. – Shahbaz

답변

2

어디서나 Stack<float>::Stack(int)의 실제 코드를 볼 수 없습니다. 당신은 그것을 선언했지만 정의가 없습니다. 따라서 실제로 존재하지는 않습니다 (컴파일러가 종종 당신의 말을 받아들이는 경우도 있습니다). 그리고 링커가 그것을 찾지 못할지라도 링커는 그것을 찾을 수 없습니다.

~Stack()을 정의한 것과 비슷한 방식으로 함수를 정의하거나 다른 멤버 함수와 동일한 방식으로 코드의 다른 부분에 코드를 추가해야합니다.

+0

고마워요. – OtagoHarbour

0

클래스 템플릿을 사용하려면 클래스 템플릿을 정의해야하며 선언만으로는 충분하지 않습니다. 컴파일러가 수행하는 작업은 클래스 템플릿의 실제 사용법 (예 : Stack<int>)을 찾을 때 클래스 템플릿 정의에서 T를 대체하고 int 클래스를 생성하는 것입니다. Stack<double>을 보면 클래스 템플릿에 다른 유형의 기본 클래스가 생성되며 이러한 생성 된 유형을 템플릿 클래스라고합니다. 내가는 C++ 문법을 사용할 수있는 방법 그런데

는 < "INT"> (무시 ")는 응답은, 그냥 .... 백만 하나의 중복

+0

과 같은 내용을 답장에 넣으려면 역 따옴표로 묶으십시오. 역 인용 부호가 없으면 텍스트가 HTML로 해석되고 대부분의 brows ers는 그것을 보여주지 않을 것이다. 설명 할 답변을 편집했습니다. – cHao