Эти коды работают на G++, но не для Visual C++.
#include <iostream>
template<typename T> void foo( T& t,int some_parameter){}
template decltype(foo<int>) foo;
int main(){
std::cout << "Hello, world!\n";
}
Вот ошибка из Visual C++: -
ошибка C2206: 'foo': typedef нельзя использовать для определения функции
Поощрение: я не хочу повторять сигнатуру функции для явного создания экземпляра.
Я изменил код из https://stackoverflow.com/a/28356212 .
Какой из них неправильный? Как обойти это в Visual C++?
Текущий непрямой обходной путь
Днем позже я нашел лучший обходной путь: https://stackoverflow.com/a/50350144.
#include <tuple>
template<typename... Ts>auto instantiate() {
static auto funcs = std::tuple_cat(std::make_tuple(
foo1<Ts>,
foo2<Ts>
)...);
return &funcs;
}
template auto instantiate<int, double>();
Однако в Visual C++ это работает только при компиляции foo.cpp
с включенной оптимизацией: -
Custom
илиDisabled(/Od)
не подходит.- Используйте все
/O1
,/O2
и/Ox
в порядке. - Without any of
/Od
,/O1
,/O2
and/Ox
:-- Just
/Og
is OK. - Просто
/Oi
,/Ot
,/Oy
,/Ob2
,/GF
и/Gy
не подходят. - Использовать все флаги в двух строках выше можно.
- Just
Временное решение (работа с /Od
): вызов std::tuple_size<decltype(instantiate<int, double>())>
внутри фиктивной функции в .cpp. Затем объявите фиктивную функцию в заголовке.
foo
. - person cppBeginner   schedule 21.09.2020template
стоит передdecltype(foo<int>) foo;
? - person Marek R   schedule 21.09.2020