Multicasting is a fundamental networking primitive utilized by numerous applications. This also holds true for cognitive radio networks (CRNs) which have been proposed as a solution to the problems that emanate from the static non-adaptive features of classical wireless networks. A prime application of CRNs is dynamic spectrum access (DSA), which improves the efficiency of spectrum allocation by allowing a secondary network, comprising of secondary users (SUs), to share spectrum licensed to a primary licensed networks comprising of primary users (PUs). Multicasting in CRNs is a challenging problem due to the dynamic nature of spectrum opportunities available to the SUs. Various approaches, including those based in optimization theory, network coding, algorithms, have been proposed for performing efficient multicast in CRNs. In this paper, we provide a self-contained tutorial on algorithms and techniques useful for solving the multicast problem, and then provide a comprehensive survey of protocols that have been proposed for multicasting in CRNs. We conclude this paper by identifying open research questions and future research directions.