Это следует вчерашний вопрос, где я дал немного кода на C ++, который Visual Studio 2013 не мог обработать, и @ galop1n любезно предоставил обходной путь, который отлично подошел для этого случая. Но теперь я пошел немного дальше, и Visual Studio снова приносит мне горе.
template <typename T>
using ValueType = typename T::value_type;
template<typename... Containers>
void
foo(const Containers &...args) {
std::tuple<ValueType<Containers>...> x;
}
template<typename... Containers>
struct Foo {
std::tuple<ValueType<Containers>...> x;
};
Всякий раз, когда я пытаюсь создать экземпляр шаблона функции foo или шаблона класса Foo, я получаю следующие два сообщения:
Test.cpp (21): ошибка C3546: ‘…’: нет доступных пакетов параметров для расширения
а также
Test.cpp (21): ошибка C3203: «ValueType»: шаблон специализированного псевдонима нельзя использовать в качестве аргумента шаблона для параметра шаблона «_Types», ожидается реальный тип
В каждом случае (создание экземпляра foo или создание экземпляра Foo) оба сообщения указывают на строку, которая определяет «x».
ОБНОВЛЕНИЕ: мой Отчет об ошибках Microsoft Теперь есть (в приложении) все основные варианты этой проблемы. Так что это будет место, чтобы посмотреть на исправление.
Может быть, следующие работы на VS2013 (более подробно: /):
template<typename... Containers>
void foo(const Containers &...args) {
std::tuple<typename std::decay<decltype(*args.begin())>::type...> x;
}
template<typename... Containers>
struct Foo {
std::tuple<typename std::decay<decltype(*std::declval<Containers>().begin())>::type...> x;
};
Других решений пока нет …