模板部分特化与cpp文件中的多个模板参数

时间:2013-07-08 06:52:59

标签: c++ visual-c++ c++11

x.h

class X
{
public:
    template<typename T1, typename T2>
    struct Bar
    {
    public:
        template<typename T1> void bar(T2 const& t2);
    };
}

x.cpp

如何定义功能?

3 个答案:

答案 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 )
{


}