2016-09-09 1 views
1

У меня есть странные ошибки компиляции с GCC 5.1.0 (tdm64-1) компиляции следующий кодСтранная ошибка компиляции при вызове явно специализированного члена класса функции шаблона

template <class T> 
struct test { 
    template <class X> 
    bool func(); 
}; 

template <class X, class Y> 
bool testfunc(X x, Y y) 
{ 
    test<Y> s; 

    if (s.func<X>()) // <-- parse error here 
     return false; 
} 

void func2() 
{ 
testfunc(double(), long()); 
} 

Ошибка

testX.cpp: In function 'bool testfunc(X, Y)': 
testX.cpp:12:15: error: expected primary-expression before '>' token 
    if (s.func<X>()) 
      ^
testX.cpp:12:17: error: expected primary-expression before ')' token 
    if (s.func<X>()) 

Обратите внимание, что ошибка возникает только в версии, когда Y является параметром шаблона. Когда я удаляю параметр шаблона Y и создаю экземпляр теста с известным типом (например, test < int>), он компилируется без ошибок.

Итак, что здесь не так?

ответ

4

Изменить это:

if (s.func<X>()) 

Для этого:

if (s.template func<X>()) 

Причиной является s.func<X> является зависимым именем, поэтому компилятор не может сказать, что func является функцией членом шаблона.

3

Поскольку s.func<X>() является зависимым именем, вы должны сообщить компилятору, что func является шаблоном, используя ключевое слово template:

s.template func<X>() 
+0

удивительным. Но где двусмысленность? Указывает ли ключевое слово template, что func является шаблоном или что это функция-член шаблона? Даже если я расскажу компилятору, что это шаблон, компилятор все еще не знает, является ли он членом или функцией. (Ну, возможно, это ясно из синтаксиса) –

+1

@AndreasH. Вы не можете иметь переменные-члены шаблона, поэтому из синтаксиса ясно. Проблема связана с токенами '<' and '>', которые сильно перегружены в C++. – TartanLlama

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