2015-03-11 2 views
8

У меня есть странная ошибка компиляции gcc-4.9.2, где тот же код работал с другими компиляторами, такими как gcc-4.8 или любой clang, который я мог бы получить. Проблема связана с non-type template-arguments. Так считают это:gcc-4.9.2: параметр шаблона непигового типа

#include <iostream> 
#include <cstddef> 

int templateParam; 

template <int &D> struct TestTemplate { 
    int value() {} 
}; 

template <> int TestTemplate<templateParam>::value() { 
    return templateParam; 
} 

TestTemplate<templateParam> testVariable; 

int main() { 

    std::cout << testVariable.value() << "\n"; 

    return 0; 
} 

я получаю следующее сообщение об ошибке с GCC-4.9.2:

prog.cpp:10:17: error: prototype for 'int TestTemplate<D>::value() [with int& D = (* & templateParam)]' does not match any in class 'TestTemplate<(* & templateParam)>' 
template <> int TestTemplate<templateParam>::value() { 
       ^
prog.cpp:7:9: error: candidate is: int TestTemplate<D>::value() [with int& D = (* & templateParam)] 
    int value() {} 
     ^

эти два ideones сделать его более ясным:

Является ли это ошибкой компилятора?

ответ

3

Является ли это ошибкой компилятора?

Да, я думаю, это было https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63658 и будет исправлено в следующем выпуске.

+0

hmpf, не то, что я надеялся ;-(Спасибо в любом случае. Так что на основе bugreport один способ обхода - использовать указатели вместо ссылок (попробовал) – klsdjfhsalkjfhl

+0

Чтобы добавить ['gcc-4.3.2'] (https://www.gnu.org/software/gcc/releases.html) больше, чем 6 лет. –

+0

да, но это тот, который предоставляется ideone ... Пробовал все компиляторы, доступные в Jessie ... – klsdjfhsalkjfhl