2016-07-04 3 views
1

У меня есть следующий (упрощенный) код:Использование функции шаблона в шаблон класса

#include <iostream> 

class Foo { 
public: 
    template<class T> 
    static size_t f() { 
    return sizeof(T); 
    } 
}; 

template<class A> 
class Bar { 
public: 
    template<class B> 
    static void f(B const& b) { 
    std::cout << A::f<B>() << std::endl; 
    } 
}; 

int main() { 
    Bar<Foo>::f(3.0); 
    return 0; 
} 

Он отлично компилируется в MSVC, но в НКУ (5.2.1) это дает следующее сообщение об ошибке:

main.cpp:16:26: error: expected primary-expression before ‘>’ token 
    std::cout << A::f<B>() << std::endl; 
         ^

(далее следует несколько сотен строк ошибок, связанных с cout). Я полагаю, он не понимает, что A::f может быть функцией шаблона? Разбивается ли что-нибудь в стандарте?

ответ

3

Вы должны поместить ключевое слово template:

std::cout << A::template f<B>() << std::endl; 

Вы должны поместить его, потому что A является зависимым именем, в противном случае компилятор может интерпретировать это как оператор сравнения:

A::f < B 
+1

Спасибо, именно то, что я искал. MSVC очень прощает эти ключевые слова :((Я предполагаю, что он даже не пытается разобрать тело функции, пока не понадобится его экземпляр). – riv

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