В следующем коде:VARIADIC вспомогательная функция с частичным аргументом пакета
#include <iostream>
struct Base {
virtual ~Base() = default;
template <typename T, typename... Args> void helper (void (T::*)(Args..., int), Args...);
void bar (int n) {std::cout << "bar " << n << std::endl;}
};
struct Derived : Base {
void baz (double d, int n) {std::cout << "baz " << d << ' ' << n << std::endl;}
};
template <typename T, typename... Args>
void Base::helper (void (T::*f)(Args..., int), Args... args) {
// A bunch on lines here (hence the motivation for the helper function)
for (int n = 0; n < 5; n++)
(dynamic_cast<T*>(this)->*f)(args..., n);
// ...
}
int main() {
Base b;
Derived d;
b.helper(&Base::bar); // GCC 4.8.1 will accept this, Visual Studio 2013 won't.
d.helper<Derived, double>(&Derived::baz, 3.14); // Visual Studio 2013 will accept this, GCC 4.8.1 won't
}
Я не могу получить ни GCC4.8.1 или VS2013 скомпилировать обе строки выше. Они будут компилировать только один, но не другой (и они не согласны с тем, какая строка правильная и неправильная). В сообщении об ошибке указано, что вычет шаблона не был выполнен обоими компиляторами. Так что же вообще не так? Я поставил все параметры шаблона в последней строке (что, как я думал, будет выводимым), но GCC все же не может быть выведено, хотя VS может. Однако VS не может вывести аргументы шаблона для строки b.foo(&Base::bar);
, когда я поместил для этого аргументы шаблона, но GCC может вывести их без аргументов шаблона. Здесь совершенно сбиты с толку. Оба компилятора прослушиваются здесь? Любое исправление возможно на стороне программиста?
Что-то говорит мне, что обе строки недействительны, но я пока не могу объяснить причину. – Barry
@Barry. Надеюсь, ты прав. Затем выяснение правильных двух строк в main() решит проблему, не беспокоясь о какой-либо ошибке со стороны компиляторов. – prestokeys
Вы получаете совершенную переадресацию неправильно: двойной вычет с одним переадресованным. Я считаю, что одно использование невозможно. – Yakk