x.h
class X
{
public:
template<typename T1, typename T2>
struct Bar
{
public:
template<typename T1> void bar(T2 const& t2);
};
}
x.cpp
如何定义功能?
答案 0 :(得分:1)
您遇到问题,T1
会掩盖T1
中的struct Bar
。您可以将其更改为T3
,如下所示:
class X
{
public:
template<typename T1, typename T2>
struct Bar
{
public:
template<typename T3> void bar(T3 const& t3); // Could define it here {}
};
}; // <-- Missing closing brace
template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar(T3 const& t3){} // Assuming `T3 const& t3` otherwise...
或者
template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar(T2 const& t2){}
然后这样称呼它:
X::Bar<int, int> b;
b.bar(1);
或
X::Bar<int, int> b;
b.bar<int>(1);
答案 1 :(得分:1)
与任何模板一样,您需要在任何可能隐式实例化它的转换单元中包含该定义,因此您应该将它放在头文件而不是.cpp文件中。如果你想在线外包含函数的定义,这里是如何写它:
template<typename T1, typename T2> template<typename T3>
void X::Bar<T1, T2>::bar(T2 const &t2) {
// ...
}
另外值得注意的是,您的类定义格式不正确,因为您使用内部模板的参数T1
来遮蔽外部模板的参数T1
。你需要重命名其中一个。
答案 2 :(得分:0)
这是你的想法吗?
class X
{
public:
template<typename T1, typename T2>
struct Bar
{
public:
void bar(T2 const& t2);
};
};
template <typename T1, typename T2> void X::Bar<T1, T2>::bar( T2 const & t2 )
{
}
请注意,我删除了template<typename T1>
void bar
,因为该资格已经是template<typename T1, typename T2> struct Bar
的一部分。
编辑:如果您确实需要第三种类型来限定bar
,请考虑以下示例:
class X
{
public:
template<typename T1, typename T2>
struct Bar
{
public:
template <typename T3>
void bar(T1 const &t1, T2 const &t2, T3 const &t3);
};
};
template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar( T1 const &t1, T2 const &t2, T3 const &t3 )
{
}