2010-02-16 34 views
11

Tôi thành thật không biết tại sao điều này lại xảy ra. Tôi đã kiểm tra, kiểm tra hai dấu ngoặc và dấu ngoặc nhọn ba dấu kiểm, dấu chấm phẩy, các hàm tạo di chuyển xung quanh, v.v. và nó vẫn cho tôi lỗi này.Nhà xây dựng dự kiến, trình phá hủy hoặc chuyển đổi loại trước mã thông báo '*'

Các mã có liên quan sau.

BinTree.h

#ifndef _BINTREE_H 
#define _BINTREE_H 

class BinTree 
{ 
private: 
    struct Node 
    { 
     float data; 
     Node *n[2]; 
    }; 
    Node *r; 

    Node* make(float); 

public: 
    BinTree(); 
    BinTree(float); 
    ~BinTree(); 

    void add(float); 
    void remove(float); 

    bool has(float); 
    Node* find(float); 
}; 

#endif 

Và BinTree.cpp

#include "BinTree.h" 

BinTree::BinTree() 
{ 
    r = make(-1); 
} 

Node* BinTree::make(float d) 
{ 
    Node* t = new Node; 
    t->data = d; 
    t->n[0] = NULL; 
    t->n[1] = NULL; 
    return t; 
} 
+2

Nó sẽ là hữu ích nếu bạn (a) sao chép trong thông báo lỗi đầy đủ, (b) chỉ ra nơi trong mã nó xảy ra và (c) mà trình biên dịch vào nền tảng bạn' tái sử dụng. –

+0

Cần lưu ý rằng các nhân viên bảo vệ của bạn không an toàn. Tên bắt đầu bằng dấu gạch dưới chữ cái viết hoa được dành riêng cho trình biên dịch. Bạn nên làm một cái gì đó như thay đổi '_BINTREE_H' thành' BINTREE_H' – GManNickG

Trả lời

21

Bởi vì trên dòng:

Node* BinTree::make(float d) 

loại Node là thành viên của class BinTree.

Làm cho nó:

BinTree::Node* BinTree::make(float d) 
+0

Geez, KHÔNG biết bạn phải làm điều đó. Rất cám ơn vì đã dọn dẹp cho tôi! – Freezerburn

+2

Rất khó. Thật thú vị, bạn không phải đủ điều kiện * tham số * với 'BinTree ::' - chỉ trả về các kiểu. –

+1

@j_random_hacker: tham số-khai báo-khoản (và tất cả mọi thứ đó là một phần của định nghĩa hàm sau tên định danh có tên hàm) nằm trong 'phạm vi tiềm năng của khai báo' cho 'định nghĩa lớp' (3.3.6/5 " Phạm vi lớp học "). Nói cách khác, tất cả các thành viên của một lớp nằm trong phạm vi cho các định nghĩa hàm thành viên * sau * tên của hàm. Vì vậy, kiểu trả về không nhận được lợi ích khi ở trong phạm vi lớp; nó đến quá sớm. C++ 0x có cú pháp * trailing-return-type * mới cho phép bạn làm việc xung quanh điều này, nhưng nó thực sự được thêm vào để suy ra các kiểu trả về trong các khuôn mẫu. –

Các vấn đề liên quan