指针的C ++模板专业化? [英] C++ template specialization for pointer?

查看:101
本文介绍了指针的C ++模板专业化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读了书< C ++模板-完整指南>和所学指针的模板专门知识。 (也许我误会了本书的这一部分)

I read book < C++ Templates - the Complete Guide > and learned template specialization for pointer. (maybe I misunderstand this part of the book)

(1)这是我的简单模板:

(1) Here's my simple template:

#include <iostream>

template<typename T>
void Function(const T& a)
{
    std::cout << "Function<T>: " << a << std::endl;
}

template<typename T>
void Function<T*>(const T* a)
{
    std::cout << "Function<T*>: " << a << std::endl;
}

int main(void)
{
    Function(1);
    Function(1.2);
    Function("hello");
    Function((void*)0x25);

    return 0;
}

我使用ubuntu16.04 x64,g ++ 5.3,编译器报告:

I use ubuntu16.04 x64, g++ 5.3, the compiler report:

$ g++ main.cpp -o main.exe 
main.cpp:10:29: error: non-type partial specialization ‘Function<T*>’ is not allowed
 void Function<T*>(const T* a)

(2),但此代码正确:

(2) but this code is correct:

#include <iostream>

template<typename T>
void Function(const T& a)
{
    std::cout << "Function<T>: " << a << std::endl;
}

int main(void)
{
    Function(1);
    Function(1.2);
    Function("hello");
    Function((void*)0x25);

    return 0;
}

结果显示:

$ g++ main.cpp -o main.exe
$ ./main.exe 
Function<T>: 1
Function<T>: 1.2
Function<T>: hello
Function<T>: 0x25

我的问题是:关于指针专门化的书是错误的吗?还是我不明白书中这部分的含义?还是其他?

My question is: Is the book about pointer specialization is wrong ? Or I mis understand the meaning of this part in the book ? Or something else ?

有关类中指针专门化的更新。

Update about pointer specialization in class.

(3)具有指针专门化的模板类:

(3) template class with pointer specialization:

#include <iostream>

template<typename T>
struct Base {
    T member;

    Base(const T& a)
        : member(a)
    {
    }

    void hello()
    {
        std::cout << member << std::endl;
    }
};

template<typename T>
struct Base<T*> {
    T* member;

    Base(T* a)
        : member(a)
    {
    }

    void hello()
    {
        std::cout << member << std::endl;
    }
};

int main(void)
{
    Base<int> b1(12);
    Base<double> b2(2.4);
    Base<char*> b3("hello");
    Base<void*> b4((void*)0x25);

    b1.hello();
    b2.hello();
    b3.hello();
    b4.hello();

    return 0;
}

此代码正确,但有一个警告:

this code is correct with one warning:

$ g++ main.cpp -o main.exe 
main.cpp: In function ‘int main()’:
main.cpp:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     Base<char*> b3("hello");
                           ^
$ ./main.exe 
12
2.4
hello
0x25

(4)没有指针专门化的模板类:

(4) template class without pointer specialization:

#include <iostream>

template<typename T>
struct Base {
    T member;

    Base(const T& a)
        : member(a)
    {
    }

    void hello()
    {
        std::cout << member << std::endl;
    }
};

int main(void)
{
    Base<int> b1(12);
    Base<double> b2(2.4);
    Base<char*> b3("hello");
    Base<void*> b4((void*)0x25);

    b1.hello();
    b2.hello();
    b3.hello();
    b4.hello();

    return 0;
}

结果是相同的:

$ g++ main.cpp -o main.exe
main.cpp: In function ‘int main()’:
main.cpp:39:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     Base<char*> b3("hello");
                           ^
$ ./main.exe 
12
2.4
hello
0x25

这是否意味着不需要指针专门化?
或此功能在不同的编译器上的行为可能有所不同吗?

Does this means pointer specialization is needless ? Or maybe this feature behave differently on different compiler ?

推荐答案

错误消息告诉您出了什么问题:

The error message told you what is wrong:


non-type partial specialization ‘Function<T*>’ is not allowed


您只能部分专门化类型(类)。您尝试了部分专门化功能。函数不是类型;您只能完全专门化它们。

You can only partially specialize types (classes). You've tried to partially specialize a function. Functions are not types; you can only fully specialize them.

这篇关于指针的C ++模板专业化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆