Đây là một đoạn của một lớp mẫu mà đang gây ra lỗi biên dịch:dự kiến lồng nhau-tên-specifier trước 'sktraits'
/* Secondary index class */
template<class TKey, class TVal, class key_traits, class val_traits>
template<class TSecKey, class sktraits>
class CBtreeDb<TKey, TVal, key_traits, val_traits>::CDbSecondaryIndex: protected CBtreeDb<TKey, TVal>, public IDeallocateKey
{
public:
typedef TSecKey skey_type;
typedef typename sktraits skey_traits;
typedef CNewDbt<TSecKey, sktraits> CDbSKey;
typedef typename iterator_t<TSecKey, skey_traits> iterator;
typedef typename iter_lower_bound_t<skey_type> iter_lower_bound;
typedef typename iter_upper_bound_t<skey_type> iter_upper_bound;
CDbSecondaryIndex(CDbEnv* pEnv, u_int32_t flags, bool bAllowDuplicates=false):
CBtreeDb(pEnv, flags, bAllowDuplicates)
{
}
// Class implementation continues ...
};
Thông điệp biên dịch lỗi tôi nhận được là:
expected nested-name-specifier before 'sktraits'.
Trên thực tế , lỗi này xảy ra trên mọi tuyên bố typedef
sau đó typename
Tôi đã biên dịch mã này thành công trong quá khứ bằng cách sử dụng VS2005 và VS2008 trên X P.
Tôi hiện đang xây dựng trên Ubuntu 9.10, sử dụng gcc 4.4.1
Tôi nhìn lỗi này trên Google và nó xuất hiện rằng typename
là không cần thiết trên dòng (nơi lỗi xảy ra), vì giả định tiêu chuẩn là một định danh trong vị trí đó là một kiểu. g ++ dường như đang phàn nàn vì nó mong đợi bất kỳ tuyên bố typename
nào có đủ điều kiện (tức là A :: B).
Đây có phải là chẩn đoán chính xác về sự cố không - nếu có, thì làm cách nào để "hoàn toàn đủ điều kiện" typename
?
Tóm lại, làm thế nào tôi có thể giải quyết vấn đề này?
Tôi đã cố sửa lỗi này (ví dụ: lấy mã để biên dịch) - chỉ cần xóa 'typename' theo sau từ chối typdef. Mặc dù tiêu đề biên dịch thành công ngay bây giờ, tôi vẫn không hài lòng vì tôi muốn biết nguyên nhân cơ bản (lý do kỹ thuật) tại sao tôi phải xóa tên tệp (đặc biệt khi ký hiệu tương tự được sử dụng trong các lớp STL) –