2012-01-17 3 views
3

У меня есть следующий класс и попытаться объявить функцию-член, которая будет возвращать указатель на этот тип, но следующий кодauto foo (...) -> decltype (this) Есть ли способ обхода?

template<class Key, int b> class b_plus_tree_inner_node { 
    auto split() -> decltype(this) {} 
}; 

дает мне такую ​​ошибку

недопустимое использование «это» на высшем уровне

Могу ли я сделать это по-другому, теперь я о существовании typedef, но может быть его возможным с помощью decltype?

EDITED:

я хочу сделать это:

b_plus_tree_inner_node<Key, b>* split() {...} 
+2

Что вы на самом деле хотите достичь? – Xeo

+1

Если вы хотите ** функцию-член **, почему вы объявляете ее вне класса? –

+0

@R. Martinho Fernandes, typo)) – Yola

ответ

5

Если вы хотите член функция объявить его в классе:

template<class Key, int b> class b_plus_tree_inner_node { 
    b_plus_tree_inner_node* split(){} 
    // also valid: 
    //b_plus_tree_inner_node<Key, b>* split(){} 
}; 

Если вы хотите не -member функция, сделать ее образцом:

template<class Key, int b> 
b_plus_tree_inner_node<Key, b>* split(){} 

Стандарт позволяет вам писать auto split() -> decltype(this) {}, но GCC 4.6 еще не поддерживает его (багажник GCC 4.7).

+0

Но проблема остается. См. Мой ответ. – TonyK

+0

Да, я не был внимателен, возможно, была иная ошибка. – Yola

+2

«Вы можете использовать это только на основе функций-членов». - это неправда. «this» может использоваться в концевом типе возвращаемого значения в «decltype». Это было установлено в камне в Мадриде, поэтому его GCC его не поддерживает. –

0

Вы, наверное, хотите:

template<class Key, int b> 
class b_plus_tree_inner_node 
{   
    b_plus_tree_inner_node<Key, b> split() 
    { 
      return /*...*/; 
    } 
}; 
+3

Нет необходимости в аргументах шаблона благодаря введенным именам классов. – Xeo

+0

** введенные имена классов ** Интересно, я знаю об этом. Я хочу проголосовать за него. Благодарю. – Yola

Смежные вопросы