编译器没有看到模板专业化?

时间:2018-03-05 22:32:18

标签: c++ c++11 templates template-specialization

我的.h文件中有模板:

template <typename T>
void addToolsAreaItem(){
    T* item = new T(_image, this);
    doSpecifiedStaff<T>(item);
    _tools.addTool(item);
}

及其在.cpp文件中的专长:

template <>
void ImageWorkspace::addToolsAreaItem<Preview>(){
    _preview = std::make_unique<QGraphicsView>(_splitter);
    _imagesLayout.addWidget(_preview.get());
}

Prewiew为空,仅用于一种情况的特殊行为(切换预览按钮时)。

但我收到了编译错误:

imageworkspace.h:45: error: new initializer expression list treated as compound expression [-fpermissive]
     T* item = new T(_image, this);
               ^~~~~~~~~~~~~~~~~~~

imageworkspace.h:45: error: no matching function for call to ‘Preview::Preview(ImageWorkspace*)’
     T* item = new T(_image, this);
               ^~~~~~~~~~~~~~~~~~~

编译器是否看到专业化?怎么解决?

函数从sorces调用为addToolsAreaItem<Preview>()

1 个答案:

答案 0 :(得分:3)

  

您需要标头中的专门化的前向声明   文件。否则,其他翻译单位看不到它。

- Henri Menke

#include "Image.h"
int main()
{
    Image::addToolsAreaItem<int>();
    system("pause");
}

Image.h标题

#pragma once    
#include <iostream>

namespace Image{

    template <typename T>
    void addToolsAreaItem();

    // forward declaration
    template <>
    void addToolsAreaItem<int>();

}

CPP:

#include "Image.h"

template <typename T>
void Image::addToolsAreaItem()
{
    std::cout << typeid(T).name() << std::endl;
}

template <>
void Image::addToolsAreaItem<int>()
{
    std::cout << "Spec: int " << std::endl;
}

输出:

enter image description here