【发布时间】:2017-03-30 17:20:29
【问题描述】:
所以,首先考虑以下从函数参数中隐式知道模板参数的情况:
#include <iostream>
using namespace std;
class A {};
class B {};
template <class T1, class T2>
class C {
T1 a;
T2 b;
};
template <class T1>
class D {
T1 a;
};
template <template<class, class> class TC, class TA, class TB>
void foo(TC<TA, TB> c) {
std::cout << "T<T,T>" << std::endl;
};
template <template<class> class TD, class TA>
void foo(TD<TA> d){
std::cout << "T<T>" << std::endl;
};
int main() {
C<A,B> c;
D<A> d;
foo(c);
foo(d);
}
输出如你所愿:
T<T,T>
T<T>
但是,如果我没有 C 和 D 类的实例,那么我需要显式调用正确的重载怎么办?这将如何完成?即,有一个main(),其中包括:
int main() {
foo<C<A,B> >();
foo<D<A> >();
}
我已经尝试了一些foo() 的重载,如下所示:
template <template<class, class> class TC>
void foo() {
std::cout << "T<T,T>" << std::endl;
};
template <template<class> class TD>
void foo(){
std::cout << "T<T>" << std::endl;
};
template <template<class, class> class TC, class TA, class TB>
void foo() {
std::cout << "T<T,T>" << std::endl;
};
template <template<class> class TD, class TA>
void foo(){
std::cout << "T<T>" << std::endl;
};
但是,这(以及我能想到的所有排列)只会导致一系列错误,如下所示(缩写)输出
prog.cpp: In function 'int main()':
prog.cpp:44:18: error: no matching function for call to 'foo()'
foo<C<A,B> >();
^
prog.cpp:44:18: note: candidates are:
prog.cpp:19:6: note: template<template<class, class> class TC> void foo()
void foo() {
^
prog.cpp:19:6: note: template argument deduction/substitution failed:
prog.cpp:24:6: note: template<template<class> class TD> void foo()
void foo(){
^
prog.cpp:24:6: note: template argument deduction/substitution failed:
我想要做的事情甚至是允许的吗?如果是这样,我在哪里搞砸了?
---- 编辑----
所以正如apple apple指出的,如果我的main()如下:
int main() {
foo<C, A, B>();
foo<D, A>();
}
我得到了预期的输出。
但是,我的真实案例最终变得更加复杂。我将在这里扩展一点。遗留代码在其他地方的标头中定义了(数百个)typedef:
typedef C<A, B> type_117;
typedef D<A> type_252;
我正在处理的类是模板化的,并使用这些 typedef 之一作为模板化参数进行实例化。所以大致如下:
template <class Type>
class Test
{
public:
Test();
SomeClass mSC;
}
Test::Test()
: mSC(foo<Type>())
{
};
其中 Test 被实例化为
Test<type_117> aTest;
所以我一直在试图弄清楚如何为这种情况编写foo()。在我在Test 的初始化程序中调用foo() 时,我是否能够“分解”它以生成<C,A,B> 表单?还是我遇到了障碍,需要重新设计一些现有框架?
【问题讨论】:
-
不是
foo<C,A,B>();吗? -
这似乎确实有效......但会导致后续问题 - 我将编辑原件
标签: c++ templates template-templates