编辑追加:问题标题是"做Visual Studio编译器或Clang有不正确的行为" - 但是已经改变了.
所以我在这里补充说clang和gcc按照我的意图编译它,但VS没有.
我有以下代码:
template<typename S, typename T, std::size_t... I>
void
print_tuple_like(S& s, const T& t, std::index_sequence<I...>)
{
void* unused[] = { &(s << std::get<I>(t))... };
}
template<typename S, typename T,
std::size_t N = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{
print_tuple_like(s, t.children, std::make_index_sequence<N>{});
return s;
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility(313): error C2338: The C++ Standard doesn't define tuple_size for this type.
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(36): note: see reference to class template instantiation 'std::tuple_size<unknown-type>' …Run Code Online (Sandbox Code Playgroud) 我有一个继承自的模板类(从现在开始作为父级引用).
模板类初始化包含子类中指定的类和构造函数的融合列表成员变量.
template<typename... ITEM_TYPES>
using List = boost::fusion::list<ITEM_TYPES...>;
template<typename... CHILDREN_TYPES>
class ElementContainer
{
protected:
const List<CHILDREN_TYPES...> children;
public:
ElementContainer(CHILDREN_TYPES&&... args) : children(forward<CHILDREN_TYPES>(args)...) {}
};
Run Code Online (Sandbox Code Playgroud)
子类的示例:
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
{
public:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
};
Run Code Online (Sandbox Code Playgroud)
当我创建这样的子类时,我必须在列表中指定类的类型两次:
一旦进入"继承自"规范:
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
Run Code Online (Sandbox Code Playgroud)
当我指定各个类的构造函数参数时:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
Run Code Online (Sandbox Code Playgroud)
我想只需要指定一次 - 当我还指定构造函数参数时,如下所示:
class XMLSignatureDocument : public ElementContainer<...>
{
public:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {}; …Run Code Online (Sandbox Code Playgroud)