移动具有类定义之外的限制的通用模板

时间:2015-11-11 17:03:57

标签: c++ templates typename

以下示例编译并显示正确的endresult。编辑:在打印三行的意义上。

#include <iostream>
using namespace std;
struct normal
{
    static void log(const char * out) { cout << out << endl; }
};

struct other
{
    static void log(const char * out) { cout << out << endl; }
};

//Implementation inside the class declaration
template<typename output = normal>
class LogUser_H
{
public:
    void print() { output::log("template"); }
};

//Move Implementation moved out of the class declaration
template<typename output = normal>
class LogUser_CPP
{
public:
    void print();
};

//Specialised definitions
void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }

//Template definition ?
//void LogUser_CPP</*??*/output/*??*/>::print(void)
//{
//    output::log("template");
//}

int main()
{
    LogUser_H<> H;
    H.print();
    LogUser_CPP<> C1;
    C1.print();
    LogUser_CPP<other> C2;
    C2.print();
}

LogUser_H有一个方法可以调用struct中的函数。 LogUser_CPP意味着我要将方法定义从类定义中移出并在下面写下来。这样做我不再有output的定义,我无法获得满足输出要求的结构中的函数。但是我可以提供结构的专用版本并以这种方式编译。

如何删除两个专门的实施void LogUser_CPP<struct normal>::print(void)void LogUser_CPP<struct other>::print(void)?想要用通用实现替换它们,看起来像注释掉的实现void LogUser_CPP</*??*/output/*??*/>::print(void)

编辑1: 我尝试了以下方法:

//Specialised definitions
//void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
//void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }
template<>
void LogUser_CPP<>::print(void)
{
    output::log("template");
}

这不会编译。

编辑2: 我尝试了以下方法:

//Specialised definitions
//void LogUser_CPP<struct normal>::print(void) { normal::log("normal specialisation"); }
//void LogUser_CPP<struct other>::print(void) { other::log("other specialisation"); }
template<typename output>
void LogUser_CPP<>::print(void)
{
    output::log("template");
}

这不会编译。 错误是error C3211: 'LogUser_CPP<normal>::print' : explicit specialization is using partial specialization syntax, use template <> instead 这可能是编译器特定的吗?这台电脑上有VS2013 Express。

1 个答案:

答案 0 :(得分:1)

使用:

template <>
void LogUser_CPP<normal>::print(void) { normal::log("normal specialisation"); }

template <>
void LogUser_CPP<other>::print(void) { other::log("other specialisation"); }

template<typename output>
void LogUser_CPP<output>::print(void)
{
    output::log("template");
}