2014-02-07 6 views
2

Это следует за yesterday's question, где я дал некоторый код 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': unspecia lized шаблона псевдонима не может быть использован в качестве аргумента шаблона для параметра шаблона «_Types», как ожидается реальный тип

В каждом случае (инстанцировании Foo или инстанцировании Foo), оба сообщения указывают на линии, которая определяет «х ».

ОБНОВЛЕНИЕ: Мой Microsoft bug report теперь имеет (в своем приложении) все основные варианты этой проблемы. Таким образом, это будет место для наблюдения за исправлением.

+0

Человек, ты просто в сосать-землю, еще раз, * Оба * работа безупречного на моем Mac звоном (лязг-500.2.79) (на основе LLVM 3.3svn). тьфу. У меня нет моего VS2013 и работаю, поэтому сохраните мне некоторые набрав и скажите, поддерживает VS2013 параметры шаблона шаблона? если это так, может быть другая работа (по крайней мере, у меня, у кого-то могут быть и другие идеи, очевидно). Изменить: поцарапать это, не собираюсь работать, как я хотел. Тьфу. – WhozCraig

+0

Возможно использование классической мета-функции вместо псевдонима типа может работать, например. 'template struct value_type {typedef typename T :: value_type type; }; ' – pmr

+0

@pmr, вы определяете« тип »с помощью typedef внутри класса шаблона, который аналогичен контейнерам« value_type »; поэтому проблема для кода приложения, обращающегося к вашему «типу», по сути, является одной и той же проблемой заново, верно? – slyqualin

ответ

0

Может быть выполнены следующие работы на 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; 
}; 
+0

Спасибо за попытку, но вы видите это, как решение @ pmr, повторяет идиому, которая заставила меня впасть в мою [первую публикацию] (http://stackoverflow.com/questions/21607167/dependent-types-with-variadic- шаблоны), т. е. использует выражение формы 'std :: tuple '. Если бы VS2013 не понял _that_, то я давно был бы счастливым человеком. :) – slyqualin

+0

Btw, verbosity меня не волнует, учитывая, что моим лучшим обходным решением до сих пор является повторение моего шаблона для 1 arg, 2 args, 3 args и 4 args. – slyqualin