我有一些代码对我来说似乎没有歧义,但 gcc4.7 令人窒息:
#include <iostream>
#include <tuple>
using namespace std;
// Container for mixins
template<template<typename> class... Mixins>
struct Mix : Mixins<Mix<Mixins...>>... {
typedef tuple<Mixins<Mix<Mixins...>>...> types;
};
// Outer layer extracts the type tuple from the argument
template<typename T>
struct InnerCombiner {
typedef typename InnerCombiner<typename T::types>::type type;
};
// Typedef type to be a new mix of the inner mixins of the MixedMixins
template<typename... MixedMixins>
struct InnerCombiner<tuple<MixedMixins...>> {
// This line is the problem. The compiler doesn't seem to be able to make sense
// of the reference to the inner mixin template template classes
typedef Mix<MixedMixins::InnerMixin...> type;
};
template<typename Mixed>
struct A {
template<typename MixedInner>
struct InnerMixin {
void foo() { cout << "foo() loves you!" << endl; };
};
};
template<typename Mixed>
struct B {
template<typename MixedInner>
struct InnerMixin {
void bar() { cout << "bar() loves you!" << endl; };
};
};
// I'm going to write out the type I expect ic to have. Oh god, it's so nasty:
// Mix<
// A<Mix<A,B>>::InnerMixin<Mix<A<Mix<A,B>>::InnerMixin,B<Mix<A,B>>::InnerMixin>,
// B<Mix<A,B>>::InnerMixin<Mix<A<Mix<A,B>>::InnerMixin,B<Mix<A,B>>::InnerMixin>
// >
int main() {
InnerCombiner<Mix<A,B>>::type ic;
ic.bar(); // Not working.
}
这样访问 InnerMixins 有问题吗?写的时候觉得挺有道理的:)
最佳答案
我可以通过指定 InnerMixin 模板使其在 clang 3.0 上运行:
typedef Mix<MixedMixins::template InnerMixin...> type;
// ^^^^^^^^
但它在 g++ 4.8 上仍然失败,
3.cpp:23:52: error: parameter packs not expanded with ‘...’: 3.cpp:23:52: note: ‘MixedMixins’
关于c++ - 如何访问可变模板参数包成员中存在的内部模板 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782803/