编译器没有发现模板特殊化?(Compiler doesn't see template sp

2019-09-27 02:47发布

我有模板在我.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);
               ^~~~~~~~~~~~~~~~~~~

难道编译器看到的专业化? 如何解决呢?

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

Answer 1:

你需要在头文件中的专业化预先声明。 否则,其他翻译单元无法看到它。

–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;
}

输出:



文章来源: Compiler doesn't see template specialization?