当前位置:  开发笔记 > 编程语言 > 正文

指针的C++模板专业化?

如何解决《指针的C++模板专业化?》经验,为你挑选了2个好方法。

我读了书和学习指针的模板专业化.(也许我误解了这本书的这一部分)

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

#include 

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

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

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

    return 0;
}

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

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

(2)但这段代码是正确的:

#include 

template
void Function(const T& a)
{
    std::cout << "Function: " << 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: 1
Function: 1.2
Function: hello
Function: 0x25

我的问题是:关于指针专业化的书是错的吗?或者我误解了书中这一部分的含义?或者是其他东西 ?

关于类中指针特化的更新.

(3)带指针特化的模板类:

#include 

template
struct Base {
    T member;

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

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

template
struct Base {
    T* member;

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

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

int main(void)
{
    Base b1(12);
    Base b2(2.4);
    Base b3("hello");
    Base 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:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     Base b3("hello");
                           ^
$ ./main.exe 
12
2.4
hello
0x25

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

#include 

template
struct Base {
    T member;

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

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

int main(void)
{
    Base b1(12);
    Base b2(2.4);
    Base b3("hello");
    Base 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 b3("hello");
                           ^
$ ./main.exe 
12
2.4
hello
0x25

这是否意味着指针专业化是不必要的?或者这个功能在不同的编译器上表现不同?



1> Andrei R...:

正如您已经被告知的那样,不允许对函数模板进行部分特化.你可以使用std::enable_if这个:

template ::value>* = 0>
void func(T val) { std::cout << val << std::endl; }

template ::value>* = 0>
void func(T val) { func(*val); }

如果您正在寻找更简单的语法,请等待概念



2> eerorika..:

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

non-type partial specialization ‘Function’ is not allowed

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有