Шаблон переменной не может связать

Следующий код:

template<typename T>
constexpr T foo { 1.2345 };

template<typename T>
T fun(T x) {
return -foo<T> * x;
}

int main() {
fun(2.0);
}

скомпилирован с использованием gcc версии 5.1.0 в Linux

g++ gcc-bug.cpp -std=c++14

завершается неудачей во время шага связывания со следующим сообщением:

/tmp/ccuciovi.o: In function `double fun<double>(double)':
gcc-bug.cpp:(.text._Z3funIdET_S0_[_Z3funIdET_S0_]+0xd): undefined reference to `foo<double>'
collect2: error: ld returned 1 exit status

Удаление унарного минуса (который меняет смысл кода), избавляет от ошибки компоновки. Предваряющий ноль (который не меняет смысла кода) также избавляет от ошибки. Следующие две реализации foo привести к успешной компиляции:

template<typename T>
T fun(T x) {
return foo<T> * x; // different meaning
}

template<typename T>
T fun(T x) {
return 0 - foo<T> * x; // same meaning
}

Я не наблюдаю такого поведения в других компиляторах. Исходный код (с унарным минусом) компилируется и работает нормально, используя clang 3.6.0 и gcc 5.2.0.

Прежде чем я отправлю это как ошибку в gcc 5.1.0, я хотел бы услышать ваше мнение о таком поведении.

3

Решение

работает нормально, используя … gcc 5.2.0

возможно https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65719

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]